C#中Task异步的常用方法

 更新时间:2025年07月07日 09:39:06   作者:xiaowu080  
Task是微软极力推荐的一种多线程处理方式,在线程的延续、取消,以及多个线程的等待处理等方面要优于Thread,ThreadPool,以下介绍的是Task的常用方法,需要的朋友可以参考下

C# 中的 Task 类是 System.Threading.Tasks 命名空间的一部分,用于表示异步操作。

一、Task.Run(Action action):

此静态方法用于在后台运行一个新任务,并返回与该任务关联的 Task 实例。

  1. 本质是将任务放入线程池执行,自动启动,适合CPU 密集型或简单异步操作
  2. 注意:返回的 Task 无法手动控制启动(已自动启动)。
Task.Run(() => Console.WriteLine("后台执行"));

二、Task.Start():

用于手动启动通过 new Task(...) 创建的未启动任务(默认状态为 Created)。

var task = new Task(() => Console.WriteLine("手动启动"));
task.Start(); // 必须调用才会执行

三、Task.Delay(int millisecondsDelay):

此静态方法创建一个在指定延迟之后完成的 Task。这对于定时操作或模拟长时间运行的任务非常有用。

await Task.Delay(1000); // 等待1秒

四、任务等待相关方法(阻塞 vs 非阻塞)

方法特性适用场景
await Task.WhenAll非阻塞等待所有任务完成异步方法中,需要等待多个任务全部完成后再继续
await Task.WhenAny非阻塞等待任一任务完成异步方法中,只需等待最快完成的任务结果
Task.WaitAll阻塞当前线程等待所有任务同步方法中强制等待(不推荐在异步代码中使用)
Task.WaitAny阻塞当前线程等待任一任务同步方法中需立即响应第一个完成的任务
Task.Wait()阻塞当前线程等待单个任务同步方法中等待单个任务(等价于 WaitAll 单任务)

关键区别

  1. await 搭配 WhenAll/WhenAny 是非阻塞等待,会释放当前线程,适合异步上下文(如 UI 线程),避免界面卡顿。
  2. Wait()/WaitAll()/WaitAny() 是阻塞等待,会冻结当前线程,可能导致性能问题(如 UI 无响应),仅建议在纯同步代码中使用。

1.Task.WhenAll(Task[] tasks):

注意:由于此调用不会默认等待,需要再前面添加await。

var task1 = Task.Run(() => { /* 任务1 */ });
var task2 = Task.Run(() => { /* 任务2 */ });
 
await Task.WhenAll(task1, task2);

2.Task.WhenAny(Task[] tasks):

注意:由于此调用不会默认等待,需要再前面添加await。

var task1 = Task.Run(() => { /* 任务1 */ });
var task2 = Task.Run(() => { /* 任务2 */ });
 
var completedTask = await Task.WhenAny(task1, task2);

3.Task.Wait():

var task = Task.Run(() => { /* 代码 */ });
task.Wait();

4.Task.WaitAll(Params Task[])

var task1 = Task.Run(() => { /* 任务1 */ });
var task2 = Task.Run(() => { /* 任务2 */ });
 
var completedTask = Task.WaitAll(task1, task2);

5.Task.WaitAny(Params Task[])

var task1 = Task.Run(() => { /* 任务1 */ });
var task2 = Task.Run(() => { /* 任务2 */ });
 
var completedTask = Task.WaitAny(task1, task2);

五、Task.ContinueWith(Action continuationAction):

此方法用于在当前任务完成后执行另一个操作。这对于链式(嵌套)任务执行非常有用。(等待一个任务完成)  

// 正常情况下 t1 和 t2 不知道谁先执行完
Task<string> t1 = new Task<string>(F1);
Task<string> t2 = new Task<string>(F2);
Task<string> t3 = new Task<string>(F3);
 
//t1先执行 t2后执行 
t1.ContinueWith(t =>
{
    // t1执行完之后 再去执行
    t2.Start(); //第二任务
    t2.ContinueWith(t4 =>
    {
        //第二个任务完成了
        //第三个任务对象
        t3.Start();
        t3.ContinueWith(t5 =>
        {
            Console.WriteLine("保证第三个任务完成");
        });
    });
});

注意:在使用 Task 类时,应始终考虑处理异常和取消操作。这可以通过使用 try-catch 语句和 CancellationToken 来实现。

到此这篇关于C#中Task异步的常用方法的文章就介绍到这了,更多相关C# Task异步用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#使用async和await实现异步编程

    C#使用async和await实现异步编程

    本文详细讲解了C#使用async和await实现异步编程的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • C# Rx的主要接口深入理解

    C# Rx的主要接口深入理解

    这篇文章主要介绍了C# Rx的主要接口深入理解的相关资料,需要的朋友可以参考下
    2017-03-03
  • WPF实现绘制3D图形的示例代码

    WPF实现绘制3D图形的示例代码

    WPF的3D功能可以在不编写任何c#代码的情况下进行绘制,只需要使用xaml即可完成3D图形的渲染。本文主要讲述了WPF-3D中的关键概念, 以及常用到的命中测试、2d控件如何在3D对象中进行渲染,希望大家有所帮助
    2023-03-03
  • C#实现动态显示及动态移除图片方法

    C#实现动态显示及动态移除图片方法

    这篇文章主要介绍了C#实现动态显示及动态移除图片方法,对于C#的初学者了解图像操作有一定的帮助,需要的朋友可以参考下
    2014-07-07
  • C#在Winform开发中使用Grid++报表

    C#在Winform开发中使用Grid++报表

    这篇文章主要介绍了C#在Winform开发中使用Grid++报表,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • c#使用netmail方式发送邮件示例

    c#使用netmail方式发送邮件示例

    这篇文章主要介绍了c#使用netmail方式发送邮件的示例,大家参考使用吧
    2014-01-01
  • C#的正则表达式Regex类使用简明教程

    C#的正则表达式Regex类使用简明教程

    这篇文章主要介绍了C#的正则表达式Regex类使用简明教程,分别讲解了如何匹配、如何获取匹配次数、如何获取匹配内容及捕获的方法,需要的朋友可以参考下
    2014-08-08
  • Winform实现调用asp.net数据接口实例

    Winform实现调用asp.net数据接口实例

    这篇文章主要介绍了Winform实现调用asp.net数据接口的方法,以实例的形式讲述了数据接口及反射辨别响应的实现方法,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • 基于C#实现语音预处理

    基于C#实现语音预处理

    无论是在音视频录制系统,还是音视频通话系统或视频会议系统中,对从麦克风采集到的说话的声音数据进行预处理,都是是非常必要的,下面就跟随小编一起来学习一下如何使用C#实现语音预处理吧
    2025-06-06
  • c# 匿名方法的小例子

    c# 匿名方法的小例子

    c# 匿名方法的小例子,需要的朋友可以参考一下
    2013-04-04

最新评论