不能从列表中删除特定的已完成任务

本文关键字:完成任务 删除 列表 不能 | 更新日期: 2023-09-27 18:13:56

下面是我的代码:

private static async Task ConcurrentTest()
{
    List<Task> subTasks = new List<Task>() { subTask() };
    while (subTasks.Count > 0)
    {
        Task nextTask = Task.WhenAny(subTasks);
        await nextTask;
        subTasks.Remove(nextTask);
        System.Diagnostics.Debug.WriteLine("subTasks count "+subTasks.Count.ToString());
    }
}
private static async Task subTask()
{
    int i = 0;
    while (!cancelTokenSource.Token.IsCancellationRequested)
    {
        System.Diagnostics.Debug.WriteLine("Test delay...");
        await Task.Delay(1000);
        if(i > 3)
        cancelTokenSource.Cancel();
        ++i;
    }
    return;
}
static CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
subTasks.Remove(nextTask) can't remove the completed task.

我知道有

subTasks.RemoveAll(x=>x.Iscompleted);

但是我不想删除在RemoveAll实例上完成的所有任务,因为我需要一个接一个地检索结果。此外,我在MSDN上看过这篇文章。

基本上,它使用相同的方法。

我想知道为什么我的坏了。

EDIT oh my..突然意识到我犯了多么愚蠢的错误!!只要像这样添加一个await就可以了…

Task nextTask = await Task.WhenAny(subTasks);

还是谢谢大家。

不能从列表中删除特定的已完成任务

WhenAny返回一个任务,该任务在任何给定任务完成时完成。所以它和你放到列表里的实例是不同的。

你可以使用这个WhenAny过载,它将返回已经完成的任务作为结果:

subTasks.Remove(nextTask.Result);

或者更简单,如Asad在注释中指出的:

subTasks.Remove(await Task.WhenAny(subTasks));

(而不是Task nextTask = Task.WhenAny(subTasks);await nextTask;),因为await关键字返回任务的结果,所以在WhenAny的情况下,导致操作完成的任务

来自WhenAny (https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.whenany%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396)的MSDN文档

创建一个任务,该任务将在提供的任何任务完成时完成。

您可以使用Task。WaitAny返回完成任务的索引,并使用subTasks.RemoveAt(index)