解释都在代码里,直接贴代码了:
private async void btnStartRequestResource_Click(object sender, EventArgs e) { ShowAndLog("准备开始异步并行任务,可能耗时较长,请稍后...", false, null); Stopwatch globalWatch = Stopwatch.StartNew(); var tasks = Enumerable.Range(0, 3).Select(i => { return Task.Run(async () => { await RequestResourceAsync(i + 1); }); }); // 上面的代码只是创建了 Task(任务),可以理解了只是创建了多个线程,并没有启动线程 //真正启动任务是下面的代码 Task.WhenAll,此时 CPU 占用立即达到 100% Task.WhenAll(tasks).GetAwaiter().GetResult(); globalWatch.Stop(); ShowAndLog(string.Format("运行结束!共耗时 {0} 毫秒。", globalWatch.ElapsedMilliseconds), false, null); } private async Task RequestResourceAsync(int resId) { //假设这里还有几个子资源等待去获取 List<int> childResIdList = new List<int>() { resId * 10 + 1, resId * 10 + 2, resId * 10 + 3, resId * 10 + 4, }; foreach (int childResIdItem in childResIdList) { //这里假设请求网络资源,或者调用 FFmpeg 转码,或者对磁盘进行 IO 操作等等耗时操作。 await webclient.GetThumbnailAsync(childResIdItem); } }
谢谢浏览!