C# 中的 Task 类是 System.Threading.Tasks 命名空间的一部分,用于表示异步操作。
此静态方法用于在后台运行一个新任务,并返回与该任务关联的 Task 实例。这对于在不阻塞当前线程的情况下启动后台操作非常有用。
Task.Run(() =>
{
// 代码
});
此静态方法创建一个在指定延迟之后完成的 Task。这对于定时操作或模拟长时间运行的任务非常有用。
await Task.Delay(1000); // 等待1秒
此静态方法接收一系列任务,并返回一个新的 Task,当所有输入任务完成时,该任务才会完成。这对于同时等待多个任务完成非常有用。 WhenAll() 是一个静态方法
注意:由于此调用不会默认等待,需要再前面添加await。
var task1 = Task.Run(() => { /* 任务1 */ });
var task2 = Task.Run(() => { /* 任务2 */ });
await Task.WhenAll(task1, task2);
此静态方法接收一系列任务,并返回一个新的 Task
注意:由于此调用不会默认等待,需要再前面添加await。
var task1 = Task.Run(() => { /* 任务1 */ });
var task2 = Task.Run(() => { /* 任务2 */ });
var completedTask = await Task.WhenAny(task1, task2);
此方法使当前线程等待任务完成。这将阻塞当前线程,直到任务完成。通常,建议使用 await 关键字而不是 Wait(),因为它可以更好地处理异步上下文和错误处理。
var task = Task.Run(() => { /* 代码 */ });
task.Wait();
等待所有任务完成 WaitAll() 是一个静态方法。
var task1 = Task.Run(() => { /* 任务1 */ });
var task2 = Task.Run(() => { /* 任务2 */ });
var completedTask = Task.WaitAll(task1, task2);
等待任意一个任务完成。 WaitAny() 是一个静态方法。
var task1 = Task.Run(() => { /* 任务1 */ });
var task2 = Task.Run(() => { /* 任务2 */ });
var completedTask = Task.WaitAny(task1, task2);
此方法用于在当前任务完成后执行另一个操作。这对于链式(嵌套)任务执行非常有用。(等待一个任务完成)
// 正常情况下 t1 和 t2 不知道谁先执行完
Task t1 = new Task(F1);
Task t2 = new Task(F2);
Task t3 = new Task(F3);
//t1先执行 t2后执行
t1.ContinueWith(t =>
{
// t1执行完之后 再去执行
t2.Start(); //第二任务
t2.ContinueWith(t4 =>
{
//第二个任务完成了
//第三个任务对象
t3.Start();
t3.ContinueWith(t5 =>
{
Console.WriteLine("保证第三个任务完成");
});
});
});
此方法用于手动启动先前创建的尚未启动的任务。通常,使用 Task.Run() 创建任务时,无需调用此方法,因为任务会自动启动。
var task = new Task(() => { /* 代码 */ });
task.Start();
注意:在使用 Task 类时,应始终考虑处理异常和取消操作。这可以通过使用 try-catch 语句和 CancellationToken 来实现。
TaskFactory类是C#中用于创建和启动任务的工厂类。通过TaskFactory类可以方便地创建并行任务,然后通过调度器来控制任务的执行顺序。使得并行任务的管理变得更加方便和高效。
TaskFactory的主要功能和使用场景:
TaskFactory与Task.Run的区别
方法用于启动一个新的Task,它接受一个Action委托作为参数,该委托定义了新任务要执行的代码。此外,它还有多个重载版本,可以接受不同的参数,如状态对象、取消令牌、任务创建选项和任务调度程序等。
Task task2 = taskFactory.StartNew(() =>
{
Console.WriteLine("Task 2 started");
Thread.Sleep(1000);
Console.WriteLine("Task 2 completed");
});
创建一个延续任务,该任务在一组指定的任务完成后开始。(等待所有任务完成)
Task t1 = new Task(F1);
Task t2 = new Task(F2);
TaskFactory factory = new TaskFactory();
factory.ContinueWhenAll(new Task[] { t1, t2 }, t =>
{
Console.WriteLine("俩个任务都完成的前提下再去执行");
Console.WriteLine(sum1 + sum2);
});
创建一个延续 Task,它将在提供的组中的任何任务完成后马上开始。(只要有任务完成)
Task t1 = new Task(F1);
Task t2 = new Task(F2);
TaskFactory factory = new TaskFactory();
factory.ContinueWhenAny(new Task[] { t1, t2 }, t =>
{
Console.WriteLine("任何一个任务完成就行");
});
本文部分借鉴与网络,如有侵权请联系删除!!!