Z
ZHANK
编程在线教程C# 教程Task 并行与多线程
异步编程

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);