无法从列表中删除特定的已完成任务

时间:2015-09-22 20:45:50

标签: c#

这是我的代码:

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上的this文章。

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

不知道为什么我的工作不起作用。

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

Task nextTask = await Task.WhenAny(subTasks);

但是谢谢你们。

1 个答案:

答案 0 :(得分:5)

WhenAny会返回任务,该任务将在完成任何给定任务时完成。所以它与您列入列表的实例不同。

您可以使用this WhenAny overload来返回已完成的任务:

subTasks.Remove(nextTask.Result);

甚至更简单,如评论中Asad所示:

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

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