在 C# 的异步编程中,Task
是一个非常重要的类,它表示一个异步操作。Task
类提供了许多方法,用于管理、控制和组合异步操作。以下是 Task
类中一些常用方法的详细讲解及其功能。
1. Task.Run
-
功能:将指定的代码块调度到线程池中异步执行。
-
用途:用于在后台线程中执行 CPU 密集型操作。
-
示例:
csharp
Task.Run(() => {Console.WriteLine("This runs on a background thread."); });
2. Task.Delay
-
功能:创建一个在指定时间后完成的
Task
。 -
用途:用于实现异步等待,比如模拟延迟或定时任务。
-
示例:
csharp
await Task.Delay(1000); // 等待 1 秒 Console.WriteLine("1 second has passed.");
3. Task.FromResult
-
功能:创建一个已经完成并返回指定结果的
Task<TResult>
。 -
用途:用于同步方法中返回一个已完成的任务。
-
示例:
csharp
Task<int> task = Task.FromResult(42); Console.WriteLine(task.Result); // 输出: 42
4. Task.Wait
-
功能:阻塞当前线程,直到任务完成。
-
用途:用于同步等待任务完成(不推荐在异步代码中使用,可能导致死锁)。
-
示例:
csharp
Task task = Task.Run(() => Console.WriteLine("Task running.")); task.Wait(); // 阻塞,直到任务完成
5. Task.WaitAll
-
功能:阻塞当前线程,直到所有提供的任务完成。
-
用途:用于同步等待多个任务完成。
-
示例:
csharp
Task task1 = Task.Run(() => Console.WriteLine("Task 1")); Task task2 = Task.Run(() => Console.WriteLine("Task 2")); Task.WaitAll(task1, task2); // 等待所有任务完成
6. Task.WaitAny
-
功能:阻塞当前线程,直到任何一个提供的任务完成。
-
用途:用于同步等待多个任务中的任意一个完成。
-
示例:
csharp
Task task1 = Task.Run(() => Thread.Sleep(1000)); Task task2 = Task.Run(() => Thread.Sleep(500)); int completedTaskIndex = Task.WaitAny(task1, task2); // 返回第一个完成的任务的索引 Console.WriteLine($"Task {completedTaskIndex + 1} completed first.");
7. Task.WhenAll
-
功能:创建一个任务,该任务在所有提供的任务完成后完成。
-
用途:用于异步等待多个任务完成。
-
示例:
csharp
Task task1 = Task.Run(() => Console.WriteLine("Task 1")); Task task2 = Task.Run(() => Console.WriteLine("Task 2")); await Task.WhenAll(task1, task2); // 异步等待所有任务完成
8. Task.WhenAny
-
功能:创建一个任务,该任务在任何一个提供的任务完成后完成。
-
用途:用于异步等待多个任务中的任意一个完成。
-
示例:
csharp
Task task1 = Task.Run(() => Thread.Sleep(1000)); Task task2 = Task.Run(() => Thread.Sleep(500)); Task completedTask = await Task.WhenAny(task1, task2); // 返回第一个完成的任务 Console.WriteLine("A task has completed.");
9. Task.ContinueWith
-
功能:创建一个在任务完成后执行的任务。
-
用途:用于任务完成后执行额外的逻辑。
-
示例:
csharp
Task task = Task.Run(() => Console.WriteLine("Initial task.")); task.ContinueWith(t => Console.WriteLine("Continuation task."));
10. Task.ConfigureAwait
-
功能:配置任务的等待行为,决定是否回到原始上下文(如 UI 线程)。
-
用途:用于优化异步代码的性能,避免不必要的上下文切换。
-
示例:
csharp
await Task.Run(() => Console.WriteLine("Background task.")).ConfigureAwait(false); // 不回到原始上下文
11. Task.Start
-
功能:启动一个任务。
-
用途:用于手动启动任务(通常与
Task
构造函数一起使用)。 -
示例:
csharp
Task task = new Task(() => Console.WriteLine("Task started.")); task.Start();
12. Task.RunSynchronously
-
功能:在当前线程上同步运行任务。
-
用途:用于强制任务在当前线程上执行。
-
示例:
csharp
Task task = new Task(() => Console.WriteLine("Running synchronously.")); task.RunSynchronously();
13. Task.Result
-
功能:获取任务的返回值(阻塞当前线程,直到任务完成)。
-
用途:用于同步获取任务的结果(不推荐在异步代码中使用,可能导致死锁)。
-
示例:
csharp
Task<int> task = Task.Run(() => 42); int result = task.Result; // 阻塞,直到任务完成 Console.WriteLine(result); // 输出: 42
14. Task.IsCompleted
-
功能:检查任务是否已完成。
-
用途:用于判断任务的状态。
-
示例:
csharp
Task task = Task.Run(() => Thread.Sleep(1000)); if (task.IsCompleted) {Console.WriteLine("Task is completed."); }
15. Task.IsFaulted
和 Task.Exception
-
功能:
-
IsFaulted
:检查任务是否因异常而失败。 -
Exception
:获取任务抛出的异常。
-
-
用途:用于处理任务中的异常。
-
示例:
csharp
Task task = Task.Run(() => throw new Exception("Task failed.")); if (task.IsFaulted) {Console.WriteLine($"Task failed: {task.Exception.Message}"); }
16. Task.IsCanceled
-
功能:检查任务是否被取消。
-
用途:用于判断任务是否因取消而结束。
-
示例:
csharp
CancellationTokenSource cts = new CancellationTokenSource(); Task task = Task.Run(() => {cts.Token.ThrowIfCancellationRequested(); }, cts.Token);cts.Cancel(); if (task.IsCanceled) {Console.WriteLine("Task was canceled."); }
总结
方法名 | 功能描述 | 适用场景 |
---|---|---|
Task.Run | 在后台线程中执行代码 | CPU 密集型操作 |
Task.Delay | 创建一个延迟任务 | 异步等待 |
Task.FromResult | 创建一个已完成的任务 | 同步方法中返回任务 |
Task.Wait | 阻塞当前线程,直到任务完成 | 同步等待任务完成 |
Task.WaitAll | 阻塞当前线程,直到所有任务完成 | 同步等待多个任务完成 |
Task.WaitAny | 阻塞当前线程,直到任意一个任务完成 | 同步等待多个任务中的任意一个完成 |
Task.WhenAll | 异步等待所有任务完成 | 异步等待多个任务完成 |
Task.WhenAny | 异步等待任意一个任务完成 | 异步等待多个任务中的任意一个完成 |
Task.ContinueWith | 在任务完成后执行额外逻辑 | 任务链式操作 |
Task.ConfigureAwait | 配置任务的等待行为 | 优化异步代码性能 |
Task.Start | 启动任务 | 手动启动任务 |
Task.RunSynchronously | 在当前线程上同步运行任务 | 强制任务在当前线程执行 |
Task.Result | 获取任务的返回值 | 同步获取任务结果 |
Task.IsCompleted | 检查任务是否完成 | 判断任务状态 |
Task.IsFaulted | 检查任务是否因异常失败 | 处理任务异常 |
Task.IsCanceled | 检查任务是否被取消 | 判断任务是否取消 |
通过合理使用这些方法,你可以更好地管理和控制异步任务,编写高效、可靠的异步代码。