8.8并行请求(批量下载)
在需要同时发送多个 HTTP 请求的场景下(如批量下载、并发调用多个 API、混合执行不同类型的请求等),可以使用框架内置的 ParallelUtility 工具类,提供更简洁的 API,并支持控制最大并发数。
在需要同时发送多个 HTTP 请求的场景下(如批量下载、并发调用多个 API、混合执行不同类型的请求等),可以使用框架内置的 ParallelUtility 工具类,提供更简洁的 API,并支持控制最大并发数。
对集合并发执行相同操作#
使用 ParallelUtility.ForEachAsync 对集合中的每个元素并发执行相同的异步操作:
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 参数控制最大并发数:
await ParallelUtility.ForEachAsync(urls, async (url, token) =>{ await _httpRemoteService.GetAsStringAsync(url, cancellationToken: token);}, maxDegreeOfParallelism: 2); // 最多同时执行 2 个请求并发执行多个不同的操作#
当需要同时执行多个不同类型的操作时,使用 ParallelUtility.RunAsync:
// 并发执行多个不同的请求,所有操作同时执行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));若需要获取返回值,可使用泛型重载:
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] 按传入顺序对应各操作的结果