如何在 C# 中运行多个异步任务并等待它们全部完成?

背景知识

在 C# 中,可以通过 async/await 关键字实现异步编程。使用异步编程可以获得更好的性能和更高的响应速度。当需要在程序中运行多个异步任务时,可以使用 Task.WaitAll() 方法等待它们全部完成。本文将介绍如何在 C# 中运行多个异步任务并等待它们全部完成。

多个异步任务的实现

在 C# 中,可以使用 Task 类来实现异步任务。下面是一个简单的异步任务实现示例:

private async Task DownloadFileAsync(string url)

{

using (HttpClient client = new HttpClient())

{

HttpResponseMessage response = await client.GetAsync(url);

if (response.IsSuccessStatusCode)

{

string content = await response.Content.ReadAsStringAsync();

return content;

}

else

{

return null;

}

}

}

上面的代码使用 HttpClient 类来下载指定 URL 的文件,并返回下载的文件内容。方法的返回类型为 Task,表示这是一个异步任务,返回的值是一个字符串。

等待多个异步任务完成

当需要在程序中运行多个异步任务时,可以使用 Task.WaitAll() 方法等待它们全部完成。下面是一个使用 Task.WaitAll() 方法等待多个异步任务完成的示例:

private async Task DownloadFilesAsync(string[] urls)

{

List> tasks = new List>();

foreach (string url in urls)

{

Task task = DownloadFileAsync(url);

tasks.Add(task);

}

await Task.WhenAll(tasks);

foreach (Task task in tasks)

{

if (task.Status == TaskStatus.RanToCompletion)

{

string content = task.Result;

// 处理文件内容

}

}

}

上面的代码使用 Task.WhenAll() 方法等待所有异步任务完成。Task.WhenAll() 方法返回一个任务,该任务在所有传入的任务都完成时变为成功状态。在等待任务完成后,可以遍历所有任务并处理返回的结果。

示例解释

以上示例首先创建了一个 List> 对象 tasks,用于存储所有异步任务。然后使用 foreach 循环遍历传入的 URL,为每个 URL 创建一个异步任务,并将其添加到 tasks 列表中。

接下来使用 Task.WhenAll() 方法等待所有异步任务完成。使用 await 关键字等待 Task.WhenAll() 方法返回的任务完成。等待完成后,使用 foreach 循环遍历所有任务,并处理任务返回的结果。在这个示例中,如果任务的状态为 TaskStatus.RanToCompletion,则表示异步任务已经成功完成,并使用 task.Result 获取异步任务的返回结果。

总结

在 C# 中,使用异步编程可以获得更好的性能和更高的响应速度。当需要在程序中运行多个异步任务时,可以使用 Task.WaitAll() 方法等待它们全部完成。本文介绍了如何在 C# 中运行多个异步任务并等待它们全部完成,并提供了示例代码来演示实现过程。

后端开发标签