在使用Task.WaitAll方法时,在未观察到的单个任务上使用取消令牌(或者至少我认为没有)时,我遇到了问题。我想并行处理这些项目,但是该过程似乎仍然“挂起”,有时要花几个小时才能处理(即使列表中只有几个项目)。查看我们的应用程序日志时,我可以看到最后一个条目出现在“ ProcessItem”函数中(这是任务所调用的)。几乎感觉好像任务卡住了而不是取消。或者,WaitAll函数不会将取消状态视为“完成”。
List<Task> tasks = new List<Task>();
foreach(var item in items)
{
CancellationTokenSource cancellationToken = new CancellationTokenSource();
cancellationToken.CancelAfter(1000 * 60); //60 seconds
Task task = new Task(() => ProcessItem(item), cancellationToken.Token);
task.Start();
tasks.Add(task);
}
Task.WaitAll(tasks.ToArray());