这是我的代码:
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);
但是谢谢你们。
答案 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
导致操作完成的任务。