it编程 > 编程语言 > Asp.net

C#中Task异步的常用方法

19人参与 2025-07-07 Asp.net

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异步用法内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

C#中的csc命令和dotnet命令详解

07-07

C#读写文本文件的多种方式详解

07-06

C#中配置管理方式全面详解(从传统方式到现代配置系统)

07-08

C#中Guid类使用小结

07-04

C#针对System.Drawing.Bitmap压缩的实现

07-04

C#中Type类的具体使用

07-04

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论