在 C# 编程中,当需要同时等待多个异步操作全部完成时,应该如何利用 await 关键字来实现?请描述具体的语法和使用方式。
考察说明
考查对 C# 异步编程中 await 关键字的理解,尤其是如何等待多个异步任务完成。
回答思路
- 【回答框架 1】在 C# 中,await 关键字用于等待一个可等待对象(如 Task 或 Task<T>)异步完成。若要等待多个异步操作,常见做法是使用 Task.WhenAll 方法,它接受一系列任务,并返回一个在所有任务完成后完成的任务。
- 【回答框架 2】例如,如果有两个异步方法 Task<int> GetDataAsync() 和 Task<string> GetMessageAsync(),可以调用 Task.WhenAll(GetDataAsync(), GetMessageAsync()) 来同时启动它们,并使用 await 等待所有任务完成。
- 【回答框架 3】除了 WhenAll,还有 Task.WhenAny 可以等待任意一个任务完成,适用于需要最先完成的场景。此外,还可以使用 await foreach 处理异步流,但对于多个独立任务的并行等待,WhenAll 是最直接的方法。
- 【回答框架 4】使用 WhenAll 时,如果其中一个任务抛出异常,WhenAll 返回的任务最终会失败,但所有任务都会执行完。可以通过捕获异常并检查每个任务的异常信息来处理。
- 【回答框架 5】另一种方式是手动使用 Task.WaitAll(同步阻塞),但 await WhenAll 更符合异步非阻塞模型,避免阻塞调用线程,提高资源利用率。
- 【关键点 1】Task.WhenAll 用于等待所有任务完成,且不阻塞线程。
- 【关键点 2】Task.WhenAny 用于等待任意任务完成。
- 【关键点 3】WhenAll 会等待所有任务结束,即使其中某些任务失败。
- 【易错点 1】不要对单个任务使用多个 await 试图并行,应使用 WhenAll 或 WhenAny。
- 【易错点 2】WhenAll 并非一定并行执行,取决于任务是否已启动;若任务是热的(已运行),则并行。
- 【易错点 3】异常处理复杂,需逐个检查任务异常。