不能从列表中删除特定的已完成任务
本文关键字:完成任务 删除 列表 不能 | 更新日期: 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)