Task 并行与多线程
Task.Run/WhenAll/WhenAny、Parallel.ForEach、线程安全
Task 并行与多线程
Task.WhenAll 并发执行多个任务;Parallel.ForEach 并行处理集合;lock 保护共享资源。
学完本章你将: 掌握 Task.Run/WhenAll、Parallel、线程安全。
WhenAll / WhenAny
csharp
// 并发下载多个 URL
var urls = new[] { "https://a.com", "https://b.com", "https://c.com" };
var tasks = urls.Select(async url =>
{
using var client = new HttpClient();
return await client.GetStringAsync(url);
});
string[] results = await Task.WhenAll(tasks);
// 所有请求并发执行,等待全部完成
// WhenAny —— 任意一个完成就继续
var firstDone = await Task.WhenAny(tasks);
Parallel.ForEach
csharp
var numbers = Enumerable.Range(1, 1000);
// 并行处理 CPU 密集型任务
var results = new ConcurrentBag<int>();
Parallel.ForEach(numbers, n =>
{
results.Add(HeavyComputation(n));
});
线程安全
csharp
// lock —— 最简单的线程同步
private readonly object _lock = new();
private int _count = 0;
void Increment()
{
lock (_lock)
{
_count++;
}
}
// 或使用 Interlocked(更轻量)
Interlocked.Increment(ref _count);