Task 概述
Task 是 C# 中用于表示异步操作的类,属于 System.Threading.Tasks 命名空间。它是基于任务的异步模式(TAP)的核心组件,用于简化异步编程,替代传统的线程和回调方式。
Task 的创建方式
通过 Task.Run 创建
将同步方法包装为异步任务,默认使用线程池线程执行:
Task task = Task.Run(() =>
{
Console.WriteLine("Task running in background");
});
通过 Task.Factory.StartNew 创建
提供更多配置选项(如任务调度器、取消令牌等):
Task task = Task.Factory.StartNew(() =>
{
Console.WriteLine("Task with custom options");
}, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);
通过构造函数创建
需手动调用 Start 方法启动任务:
Task task = new Task(() => Console.WriteLine("Manual task"));
task.Start();
Task 的返回值
使用 Task<TResult> 表示有返回值的异步操作:
Task<int> task = Task.Run(() =>
{
return 42; // 返回结果
});
int result = await task; // 获取结果
异步等待 Task
使用 await 等待任务完成(需在 async 方法中):
async Task DoWorkAsync()
{
await Task.Delay(1000); // 异步延迟
Console.WriteLine("Work completed");
}
异常处理
Task 异常会存储在 AggregateException 中,可通过 try-catch 捕获:
try
{
await TaskThatThrowsAsync();
}
catch (Exception ex)
{
Console.WriteLine($"Exception: {ex.Message}");
}
组合多个 Task
Task.WhenAll
等待所有任务完成:
Task task1 = Task.Delay(1000);
Task task2 = Task.Delay(2000);
await Task.WhenAll(task1, task2);
Task.WhenAny
等待任意一个任务完成:
Task<int> firstTask = await Task.WhenAny(task1, task2);
Console.WriteLine($"First result: {firstTask.Result}");
取消 Task
通过 CancellationToken 实现任务取消:
var cts = new CancellationTokenSource();
Task task = Task.Run(() =>
{
while (true)
{
cts.Token.ThrowIfCancellationRequested();
Thread.Sleep(100);
}
}, cts.Token);
cts.CancelAfter(1000); // 1秒后取消
性能注意事项
- 避免过度创建短期
Task,以减少线程池开销。 - 使用
ValueTask优化高频率调用的轻量级异步操作。 - 避免阻塞
Task(如调用.Result或.Wait()),可能导致死锁。
应用场景
- IO 密集型操作(如文件读写、网络请求)。
- CPU 密集型计算(需配合
Task.Run)。 - 并行处理多个独立任务。
通过合理使用 Task,可以显著提升程序的响应性和资源利用率。
3965

被折叠的 条评论
为什么被折叠?



