C# 中如何创建异步平行任务?
2024-08-30 05:33:22
解释都在代码里,直接贴代码了:
private async void btnStartRequestResource_Click(object sender, EventArgs e)
{
ShowAndLog("准备开始异步并行任务,可能耗时较长,请稍后...", false, null);
Stopwatch globalWatch = Stopwatch.StartNew();
var tasks = Enumerable.Range(, ).Select(i =>
{
return Task.Run(async () =>
{
await RequestResourceAsync(i + );
});
});
// 上面的代码只是创建了 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 * + ,
resId * + ,
resId * + ,
resId * + ,
};
foreach (int childResIdItem in childResIdList)
{
//这里假设请求网络资源,或者调用 FFmpeg 转码,或者对磁盘进行 IO 操作等等耗时操作。
await webclient.GetThumbnailAsync(childResIdItem);
}
}
谢谢浏览!
最新文章
- 如何一步一步用DDD设计一个电商网站(二)—— 项目架构
- [MacOS NSAlert的使用]
- uC/OS-II中includes块
- Mac截图快捷键
- Silverlight控件——如何提升应用程序信任度与问题解决
- Dinic算法模板
- Ubuntu下配置和使用github
- Android开发开始--环境搭建
- thrift的简单实现
- %{TIMESTAMP_ISO8601} 匹配2016-08-29 17:40:01,191
- dp related problems (update continuously)
- Java 泛型 泛型代码和虚拟机
- 关于firefox启动就崩溃的问题
- 实现input输入时智能搜索
- Spring Boot 整合JDBCTemplate
- C#action和func的使用
- C#通过COM组件操作IE浏览器(四):实用代码总结
- JavaScript高级程序设计学习(二)之基本概念
- 第14月第30天 svn 撤销ignore revert
- 【转】Java学习---深入理解线程池