引言
在多线程和异步编程中,C#的 Task 类是.NET Framework 4.0后引入的核心组件。它不仅简化了异步操作的管理,还提升了程序的响应速度和资源利用率。本文通过实例代码全面解析Task的用法要点。
一、Task基础概念
Task 表示一个异步操作,基于线程池(ThreadPool)管理,相比直接使用 Thread 类更轻量高效。
1.1 创建与启动Task
// 创建并立即启动Task
Task task1 = Task.Run(() =>
{
Console.WriteLine("Task1在后台执行!");
});
// 使用Factory创建
Task task2 = Task.Factory.StartNew(() =>
{
Console.WriteLine("Task2已启动");
});
// 同步等待任务完成
task1.Wait();
二、核心用法详解
2.1 异步方法与返回值
public static async Task<int> CalculateSumAsync(int a, int b)
{
return await Task.Run(() =>
{
Thread.Sleep(1000); // 模拟耗时操作
return a + b;
});
}
2.2 异常捕获try
{
await Task.Run(() => throw new InvalidOperationException("模拟异常"));
}
catch (InvalidOperationException ex)
{
Console.WriteLine($"捕获异常:{ex.Message}");
}
2.3 组合多个Task
Task<int> taskA = Task.Run(() => 10);
Task<int> taskB = Task.Run(() => 20);
await Task.WhenAll(taskA, taskB);
Console.WriteLine($"{taskA.Result + taskB.Result}"); // 输出30
var firstTask = await Task.WhenAny(taskA, taskB);
Console.WriteLine($"第一个完成的任务结果:{firstTask.Result}");
三、进阶技巧
3.1 取消任务(CancellationToken)
var cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
Task longRunningTask = Task.Run(() =>
{
while (!token.IsCancellationRequested)
{
Thread.Sleep(500);
Console.WriteLine("后台运行中...");
}
}, token);
Thread.Sleep(2000);
cts.Cancel(); // 请求取消
3.2 延续任务(ContinueWith)
Task.Run(() => Console.WriteLine("初始任务"))
.ContinueWith(prevTask =>
{
Console.WriteLine($"前序任务状态:{prevTask.Status}");
}, TaskContinuationOptions.OnlyOnRanToCompletion);
四、常见问题与优化
4.1 避坑指南
- 死锁风险:避免在同步代码中调用 .Result 或 .Wait()
// 错误示范
var result = CalculateSumAsync(5,5).Result;// 正确做法
var result = await CalculateSumAsync(5,5);
4.2 优化建议
- 使用 ConfigureAwait(false) 避免不必要的上下文切换
- 使用 ValueTask 优化高频率调用的异步方法
五、实战案例:并发下载器
public static async Task DownloadUrlsAsync(List<string> urls)
{
List<Task> downloadTasks = new List<Task>();
foreach (var url in urls)
{
downloadTasks.Add(Task.Run(async () =>
{
using var client = new HttpClient();
var content = await client.GetStringAsync(url);
Console.WriteLine($"已下载 {url} 长度:{content.Length}");
}));
}
await Task.WhenAll(downloadTasks);
}
总结
通过合理使用Task,开发者可以轻松实现高效并发编程。关键点在于掌握线程调度机制、正确处理异常以及根据场景选择合适的任务策略。后续将针对并行编程(Parallel)进行深度解析,欢迎关注交流!

5914

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



