首页 / C# / c# – 节流异步任务?
c# – 节流异步任务?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 节流异步任务?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1226字,纯文字阅读大概需要2分钟。
内容图文
![c# – 节流异步任务?](/upload/InfoBanner/zyjiaocheng/805/d97f395933e34ef1a0f8516de1ac2393.jpg)
我想知道如果要完成的任务数量很大,我们是否应该限制异步任务.假设您有1000个URL,您是否一次触发所有请求并等待所有请求:
var tasks = urlList.Select(url => downloadAsync(url));
await Task.WhenAll(tasks);
或者您批量处理请求并逐个处理:
foreach (var urlBatch in urlList.BatchEnumerable(BatchSize)){
var tasks = urlBatch.Select(url => downloadAsync(url));
await Task.WhenAll(tasks);
}
我认为批处理不是必需的,因为第一种方法(一次触发所有请求)将创建由ThreadPool调度的任务,因此我们应该让ThreadPool决定何时执行每个任务.但是,有人告诉我,实际上只有在任务是计算任务时才有效.当任务涉及网络请求时,第一种方法可能导致主机挂起???这是为什么 ?
解决方法:
在大多数情况下,你想限制自己.当您同时运行多个操作时,总是会将某个状态保留在某个位置.如果它们是CPU绑定的,那么任务存储在等待线程的ThreadPool队列中,如果它是异步的,那么你将状态机放在堆上.
即使异步操作通常会占用一些有限的资源,无论是带宽,端口,远程数据库服务器的CPU等.
您不必一次限制一个批次(因为您需要等待上一次操作完成而不是启动其他操作).您可以使用SlimSemahpore或甚至更好的TPL Dataflow块进行限制:
var block = new ActionBlock<string>(
url => downloadAsync(url),
new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 10 });
urlList.ForEach(url => block.Post(url));
block.Complete();
await block.Completion;
内容总结
以上是互联网集市为您收集整理的c# – 节流异步任务?全部内容,希望文章能够帮你解决c# – 节流异步任务?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。