gpt4 book ai didi

c# - 如何停止等待任务但让任务在后台运行?

转载 作者:行者123 更新时间:2023-11-30 20:15:24 26 4
gpt4 key购买 nike

如果我有一个要一起执行的任务列表,但同时我想一起执行一定数量的任务,那么我等待其中一个直到其中一个完成,这应该意味着等待应该停止并且应该允许开始一个新任务,但是当其中一个任务完成时,我不知道如何停止等待当前正在等待的任务,我不想取消任务,只是停止等待让它继续在后台运行。

我有以下代码

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在这里我了解到其他任务将被忽略,所以这不是我想要实现的解决方案。

如果问题愚蠢或错误,我很抱歉,但我似乎找不到任何有关如何解决它的信息,或者我想要实现的操作的名称是什么,所以我什至可以正确搜索。

解决方案编辑

提供的所有答案都是正确的,我接受了我决定使用的答案,但仍然所有答案都是正确的。

谢谢大家,我从你们这些不同的答案和解决问题的不同方法以及如何思考问题中学到了很多东西。

关于这个特定问题,我了解到我仍然需要等待剩下的其他任务,所以解决方案是在循环中使用 Task.WhenAny(它返回完成的任务(这也很重要)) AND Task.WhenAll 在循环外等待其他剩下的任务。

最佳答案

Task.WhenAny返回完成的任务。

foreach (var link in SharedVars.DownloadQueue)
{
var task = DownloadFile(extraPathPerLink, link, totalLen);
downloadQueueLinksTasks.Add(task);

if (downloadQueueLinksTasks.Count == batch)
{
// Wait for any Task to complete, then remove it from
// the list of pending tasks.
var completedTask = await Task.WhenAny(downloadQueueLinksTasks);
downloadQueueLinksTasks.Remove(completedTask);
}
}

// Wait for all of the remaining Tasks to complete
await Task.WhenAll(downloadQueueLinksTasks);

关于c# - 如何停止等待任务但让任务在后台运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54893821/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com