【发布时间】:2019-02-26 20:47:00
【问题描述】:
如果我有一个要一起执行的任务列表,但同时我想一起执行一定数量的任务,所以我等待其中一个,直到其中一个完成,这应该意味着等待应该停止并且应该允许开始一个新任务,但是当其中一个完成时,我不知道如何停止等待当前正在等待的任务,我不想取消任务,只是停止等待并让它继续在后台运行。
我有以下代码
foreach (var link in SharedVars.DownloadQueue)
{
if (currentRunningCount != batch)
{
var task = DownloadFile(extraPathPerLink, link, totalLen);
_ = task.ContinueWith(_ =>
{
downloadQueueLinksTasks.Remove(task);
currentRunningCount--;
// TODO SHOULD CHANGE WHAT IS AWAITED
});
currentRunningCount++;
downloadQueueLinksTasks.Add(task);
}
if (currentRunningCount == batch)
{
// TODO SHOULD NOT AWAIT 0
await downloadQueueLinksTasks[0];
}
}
我发现了Task.WhenAny,但从this comment here 我了解到其他任务将被忽略,因此这不是我想要实现的解决方案。
如果问题是愚蠢或错误的,我很抱歉,但我似乎找不到任何有关如何解决它的信息,或者我想要实现的操作的名称是什么,所以我什至可以正确搜索。
解决方案编辑
提供的所有答案都是正确的,我接受了我决定使用的答案,但仍然所有答案都是正确的。
谢谢大家,我从你们所有人那里学到了很多,从这些不同的答案和解决问题的不同方法以及如何思考它。
我了解到这个具体问题是我仍然需要等待剩下的其他任务,所以解决方案是在循环中使用Task.WhenAny(它返回完成的任务(这也很重要))AND Task.WhenAll 在循环外等待其他剩下的任务。
【问题讨论】:
标签: c# multithreading asynchronous async-await