【发布时间】:2021-04-03 15:46:54
【问题描述】:
我有一个blockingcollection的下载,我想有一个我可以做的最大并发下载数,也就是最大并发await downloadService.download(release),但是BlockingCollection的项目数应该基本上是无限的,所以假设我可以在 BlockingCollection 中有 49945 次下载,但我应该同时下载最多 5 次,每当下载完成时,它会再下载一次,如果可能的话。这是我的实际代码:
BlockingCollection<Download> sendQueue = new BlockingCollection<Download>(new ConcurrentQueue<Download>());
while (true)
{
var release = sendQueue.Take();
ThreadPool.QueueUserWorkItem(async rlZ =>
{
//do whatever you have to do
await downloadService.download(release);
}, release);
}
【问题讨论】:
-
一旦任何线程完成需要减少计数并将新项目添加到队列中,您需要保留 5 个项目的计数器。 docs.microsoft.com/en-us/dotnet/api/…
-
@mjwills 这不是限制 BlockingCollection 可以拥有的元素数量,而不是我想要对 BlockingCollection 的元素执行的并发操作的数量吗?
-
ThreadPool.QueueUserWorkItem和BlockingCollection不是最适合在 I/O 密集型工作(例如从 Web 下载内容)时使用的工具。你可以在这里看到更好的方法:How to limit the amount of concurrent async I/O operations?
标签: c# multithreading blockingcollection