C# Can';t从列表中删除特定的已完成任务

C# Can';t从列表中删除特定的已完成任务,c#,C#,这是我的密码: private static async Task ConcurrentTest() { List<Task> subTasks = new List<Task>() { subTask() }; while (subTasks.Count > 0) { Task nextTask = Task.WhenAny(subTasks); await nextTask; subTask

这是我的密码:

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.
但是我不想删除在
RemoveAll
实例中完成的所有任务,因为我需要逐个检索结果。 此外,我还看了一篇关于MSDN的文章

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

不知道为什么我的不行

编辑哦,我的。。突然意识到我犯了多么愚蠢的错误!! 只需添加这样的等待就可以了

Task nextTask = await Task.WhenAny(subTasks);

不过还是要谢谢大家。

当任何一个
返回一个新的任务时,该任务将在任何给定任务完成时完成。因此,这是一个不同于您在列表中列出的实例

您可以使用返回已完成任务的结果:

subTasks.Remove(nextTask.Result);
或者更简单,如评论中所示:

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

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

WhenAny
返回一个新任务,在完成任何给定任务时完成。因此,这是一个不同于您在列表中列出的实例

您可以使用返回已完成任务的结果:

subTasks.Remove(nextTask.Result);
或者更简单,如评论中所示:

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

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

来自WhenAny()

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


您可以使用Task.WaitAny返回完成的任务的索引,并在WhenAny()上使用MSDN文档中的subtask.RemoveAt(index)

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


可以使用Task.WaitAny返回完成任务的索引,也可以使用subtask.RemoveAt(index)

ok,这样就有了一个包含单个任务的列表。您创建一个表示列表中任何任务完成情况的新任务,然后尝试删除此新创建的任务,该任务不在列表中。为什么会这样?你能更清楚地解释一下你想在这里做什么吗?
Task.WhenAny
没有从已完成的列表中返回任务。它返回一个任务,该任务将在列表中的任何任务完成时完成。您创建一个表示列表中任何任务完成情况的新任务,然后尝试删除此新创建的任务,该任务不在列表中。为什么会这样?你能更清楚地解释一下你想在这里做什么吗?
Task.WhenAny
没有从已完成的列表中返回任务。它返回的任务将在列表中的任何任务完成时完成。抱歉,没有响应。如果子任务中的任务返回值是字典,我将无法以这种方式获得任何返回值。@CharlesParker
WhenAny
返回复合任务。它的
Result
是您的任务之一,它反过来包含您想要的结果。另外,
nextTask.Result
给我的错误是没有结果定义。@CharlesParker您在使用我给链接的重载吗?很抱歉没有响应。如果子任务中的任务返回值是字典,我将无法以这种方式获得任何返回值。@CharlesParker
WhenAny
返回复合任务。它的
Result
是您的任务之一,它又包含您想要的结果。另外,
nextTask.Result
给我的错误是没有结果定义。@CharlesParker您在使用我给链接的重载吗?