【发布时间】:2018-08-01 19:59:25
【问题描述】:
我目前正在开发一个并发文件下载器。
出于这个原因,我想参数化并发任务的数量。我不想等待所有任务完成,而是要保持相同的数量正在运行。
事实上,这个关于星溢出的线程给了我一个正确的线索,但我正在努力让它异步:
Keep running a specific number of tasks
这是我的代码:
public async Task StartAsync()
{
var semaphore = new SemaphoreSlim(1, _concurrentTransfers);
var queueHasMessages = true;
while (queueHasMessages)
{
try {
await Task.Run(async () =>
{
await semaphore.WaitAsync();
await asyncStuff();
});
}
finally {
semaphore.Release();
};
}
}
但是代码一次只执行一个。我认为等待阻止了我生成所需数量的任务,但我不知道如何在尊重信号量建立的限制的同时避免它。
如果我将所有任务添加到列表中并创建一个 whenall,信号量会抛出异常,因为它已达到最大计数。
有什么建议吗?
【问题讨论】:
-
检查this
-
或者,查看this answer 中的自定义任务计划程序。它提供并发限制,您可以在执行开始后向调度程序添加其他任务。
-
您应该将 Try & Final 保留在您正在创建的任务中。由于你在 finally 中释放信号量,它与等待不一致。
标签: c# .net asynchronous concurrency task