c# 中的 task 类是 system.threading.tasks 命名空间的一部分,用于表示异步操作。
一、task.run(action action):
此静态方法用于在后台运行一个新任务,并返回与该任务关联的 task 实例。
- 本质是将任务放入线程池执行,自动启动,适合cpu 密集型或简单异步操作。
- 注意:返回的
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 单任务) |
关键区别:
await搭配whenall/whenany是非阻塞等待,会释放当前线程,适合异步上下文(如 ui 线程),避免界面卡顿。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异步用法内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论