System.Threading.Tasks.TaskCanceledException在C#中未处理

时间:2018-06-20 02:20:20

标签: c# async-await

要关闭窗口,我使用了Environment.Exit(0);。 我收到如下错误:

未处理System.Threading.Tasks.TaskCanceledException 消息:WindowsBase.dll中发生了类型为'System.Threading.Tasks.TaskCanceledException'的未处理异常 附加信息:任务已取消。

在关闭窗口之前,有什么方法可以检查任何任务是否还在运行吗?

谢谢。

Joon

1 个答案:

答案 0 :(得分:2)

创建任务时,请将其存储在某处。如果计划创建多个任务,则可能需要一个集合来存储它们。例如,可以将其存储在ConcurrentBag中,即使在多个线程上创建任务,这也是安全的。

static class Globals
{
    static public ConcurrentBag<Task> RunningTasks { get; } = new ConcurrentBag<Task>();
}

//Main code
var task = Task.Run( () => DoSomethingThatTakesALongTime() );
Globals.RunningTasks.Add(task);

然后,在退出之前,查看它们是否仍在运行。如果是这样,您可以使用Task.Yield放弃控制权,并给他们运行的机会。

while (Globals.RunningTasks.Any( t => !t.IsCompleted ))
{
    await Task.Yield();
}
Environment.Exit(0);

但是,更好的解决方案是在可能的情况下处理异常。