代码改变世界

C# 中如何创建异步平行任务?

2019-03-29 11:05  音乐让我说  阅读(404)  评论(0编辑  收藏  举报

解释都在代码里,直接贴代码了:

        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);
            }
        }

 

谢谢浏览!