C# 多线程 05-使用 C#6.0 04-对并行执行的异步任务使用 await
操作符
🏷️ 《C# 多线程》
对并行执行的异步任务使用 await
操作符
csharp
/// <summary>
/// 对并行执行的异步任务使用 await 操作符
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Task t = AsynchronousProcessing();
t.Wait();
Console.ReadLine();
}
static async Task AsynchronousProcessing()
{
// 定义了两个任务,分别运行 3 秒和 5 秒
Task<string> t1 = GetInfoAsync("Task 1", 3);
Task<string> t2 = GetInfoAsync("Task 2", 5);
// 使用 Task.WhenALL 辅助方法创建一个任务,该任务只有在所有底层任务完成后才会运行
string[] results = await Task.WhenAll(t1, t2);
// 5 秒后获得观察结果
foreach (string result in results)
{
Console.WriteLine(result);
}
}
static async Task<string> GetInfoAsync(string name, int seconds)
{
// Task.Delay 方法不阻塞线程,而是在幕后使用了一个计时器
// 导致两个任务一般总是由同一个线程运行
await Task.Delay(TimeSpan.FromSeconds(seconds));
// 如果使用下面注释掉的代码模拟运行时间,则两个任务总是由不同的线程运行
// 因为 Thread.Sleep 方法阻塞线程
// await Task.Run(() => Thread.Sleep(TimeSpan.FromSeconds(seconds)));
return $"Task {name} is running on a thrad id {Thread.CurrentThread.ManagedThreadId}. " +
$"Is thread pool thread: {Thread.CurrentThread.IsThreadPoolThread}";
}
打印结果
5 秒后打印出结果
txt
Task Task 1 is running on a thrad id 4. Is thread pool thread: True
Task Task 2 is running on a thrad id 4. Is thread pool thread: True