为什么在使用Task.WaitAll时未观察到我的取消令牌?

时间:2019-05-02 21:56:12

标签: c# multithreading task cancellationtokensource

在使用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());

0 个答案:

没有答案