处理完成的任务
分类: .Net技术 ◆ 标签: #异步编程 #基础 #.Net ◆ 发布于: 2023-06-04 19:50:54
本节演示如何使用方法WhenAny()
来巧妙的处理多个任务的await
, 一定要仔细阅读代码。
本节代码可以从这里找到:https://github.com/hylinux/azure-demo/tree/main/dotnet/basic/asyncdemo/WhenAnyDemo
创建应用
使用如下的命令创建应用
mkdir WhenAnyDemo
cd WhenAnyDemo
dotnet new console
替换using
以编辑器打开文件Program.cs
,替换如下的using
语句
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net.Http; using System.Threading.Tasks;
定义字段
我们这里还是使用下载web服务器的内容作为应用场景
static readonly HttpClient s_client = new HttpClient { MaxResponseContentBufferSize = 1_000_000 }; static readonly IEnumerable<string> s_urlList = new string[] { "https://docs.microsoft.com", "https://docs.microsoft.com/aspnet/core", "https://docs.microsoft.com/azure", "https://docs.microsoft.com/azure/devops", "https://docs.microsoft.com/dotnet", "https://docs.microsoft.com/dynamics365", "https://docs.microsoft.com/education", "https://docs.microsoft.com/enterprise-mobility-security", "https://docs.microsoft.com/gaming", "https://docs.microsoft.com/graph", "https://docs.microsoft.com/microsoft-365", "https://docs.microsoft.com/office", "https://docs.microsoft.com/powershell", "https://docs.microsoft.com/sql", "https://docs.microsoft.com/surface", "https://docs.microsoft.com/system-center", "https://docs.microsoft.com/visualstudio", "https://docs.microsoft.com/windows", "https://docs.microsoft.com/xamarin" };
更新方法Main
更新方法Main
static Task Main() => SumPageSizesAsync();
定义方法SumPageSizesAsync
static async Task SumPageSizesAsync() { var stopwatch = Stopwatch.StartNew(); IEnumerable<Task<int>> downloadTasksQuery = from url in s_urlList select ProcessUrlAsync(url, s_client); List<Task<int>> downloadTasks = downloadTasksQuery.ToList(); int total = 0; while (downloadTasks.Any()) { Task<int> finishedTask = await Task.WhenAny(downloadTasks); downloadTasks.Remove(finishedTask); total += await finishedTask; } stopwatch.Stop(); Console.WriteLine($"\nTotal bytes returned: {total:#,#}"); Console.WriteLine($"Elapsed time: {stopwatch.Elapsed}\n"); }
定义方法ProcessUrlAsync
定义方法ProcessUrlAsync
static async Task<int> ProcessUrlAsync(string url, HttpClient client) { byte[] content = await client.GetByteArrayAsync(url); Console.WriteLine($"{url,-60} {content.Length,10:#,#}"); return content.Length; }
运行代码测试实例。