8.8并行请求(批量下载)

在需要同时发送多个 HTTP 请求的场景下(如批量下载、并发调用多个 API、混合执行不同类型的请求等),可以使用框架内置的 ParallelUtility 工具类,提供更简洁的 API,并支持控制最大并发数。

在需要同时发送多个 HTTP 请求的场景下(如批量下载、并发调用多个 API、混合执行不同类型的请求等),可以使用框架内置的 ParallelUtility 工具类,提供更简洁的 API,并支持控制最大并发数。

对集合并发执行相同操作#

使用 ParallelUtility.ForEachAsync 对集合中的每个元素并发执行相同的异步操作:

cs
var urls = new[]{    "https://furion.net/api/users",    "https://furion.net/api/orders",    "https://furion.net/api/products"};// 并发请求,默认最大并发数为 4var results = await ParallelUtility.ForEachAsync(urls, async (url, token) =>{    return await _httpRemoteService.GetAsStringAsync(url, cancellationToken: token);});// results 按原始集合顺序返回

您还可以通过 maxDegreeOfParallelism 参数控制最大并发数:

cs
await ParallelUtility.ForEachAsync(urls, async (url, token) =>{    await _httpRemoteService.GetAsStringAsync(url, cancellationToken: token);}, maxDegreeOfParallelism: 2);   // 最多同时执行 2 个请求

并发执行多个不同的操作#

当需要同时执行多个不同类型的操作时,使用 ParallelUtility.RunAsync

cs
// 并发执行多个不同的请求,所有操作同时执行await ParallelUtility.RunAsync(    token => _httpRemoteService.GetAsStringAsync("https://furion.net/api/users", cancellationToken: token),    token => _httpRemoteService.PostAsStringAsync("https://furion.net/api/orders", "\"Furion\"", cancellationToken: token),    token => _httpRemoteService.DownloadFileWithConsoleProgressAsync("https://furion.net/logo.png", @"C:\Workspaces\", FileExistsBehavior.Overwrite, cancellationToken: token));

若需要获取返回值,可使用泛型重载:

cs
var results = await ParallelUtility.RunAsync(    async token => await _httpRemoteService.GetAsStringAsync("https://furion.net/api/users", cancellationToken: token),    async token => await _httpRemoteService.GetAsStringAsync("https://furion.net/api/orders", cancellationToken: token),    async token => await _httpRemoteService.GetAsStringAsync("https://furion.net/api/products", cancellationToken: token));// results[0]、results[1]、results[2] 按传入顺序对应各操作的结果