在C#中,Task
是一个表示异步操作的类,它允许你编写逻辑,这些逻辑可以在不阻塞调用线程的情况下运行。Task
是 System.Threading.Tasks
命名空间下的一部分,通常与 async
和 await
关键字一起使用来简化异步编程。
以下是 Task
的一些关键概念和用法:
Task 类型
Task
:表示一个不返回结果的异步操作。Task<T>
:表示一个返回泛型结果的异步操作。
创建和启动 Task
- 使用
Task.Run
、Task.Factory.StartNew
或者async void
方法可以启动一个异步任务。// 使用 Task.Run 创建并启动一个不返回结果的异步任务 Task task = Task.Run(() => { // 执行一些工作 }); // 使用 Task<T>.Run 创建并启动一个返回结果的异步任务 Task<int> taskWithResult = Task.Run(() => { // 执行一些工作并返回结果 return 42; });
等待 Task 完成
- 使用
await
关键字可以等待一个Task
完成,这要求使用async
修饰的方法。public async Task DoSomethingAsync() { // 等待 Task 完成 await task; // 等待 Task<T> 完成并获取结果 int result = await taskWithResult; Console.WriteLine(result); }
处理 Task 结果
Task<T>
类型提供了Result
属性来获取异步操作的结果。// 等待 Task 完成并获取结果 int result = taskWithResult.Result;
错误处理
Task
可以处于Faulted
状态,这表示它由于异常而失败。使用Try
或Catch
方法可以处理这些异常。if (task.IsFaulted) { foreach (var exception in task.Exception.InnerExceptions) { Console.WriteLine(exception.Message); } }
取消 Task
- 使用
CancellationToken
类可以取消一个Task
。var cts = new CancellationTokenSource(); Task task = Task.Run(() => { // 异步操作 }, cts.Token); // 取消任务 cts.Cancel();
组合 Task
Task.WaitAll
和Task.WhenAll
可以用于等待多个Task
完成。// 等待多个 Task 完成 Task.WaitAll(task1, task2); // 使用 Task.WhenAll 简化代码 await Task.WhenAll(task1, task2);
连续 Task
- 使用
ContinueWith
方法可以创建一个在另一个Task
完成时开始执行的Task
。Task continuation = task.ContinueWith((previousTask) => { // 之前的 Task 完成后执行 });
异常处理
- 异步方法中,如果
await
的Task
引发了异常,异常会在await
调用的地方被抛出。public async Task SomeAsyncMethod() { try { await SomeOtherAsyncMethodThatThrows(); } catch (Exception ex) { // 处理异常 } }
Task
是C#中异步编程的核心组件之一,它提供了丰富的API来处理并发和异步操作。使用Task
和async
/await
可以提高应用程序的响应性和性能,特别是在I/O密集型或高延迟操作中。