首页 > 解决方案 > System.Threading.Tasks.TaskCanceledException 在 C# 中未处理

问题描述

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

System.Threading.Tasks.TaskCanceledException 未处理 消息:WindowsBase.dll 中出现“System.Threading.Tasks.TaskCanceledException”类型的未处理异常附加信息:任务已取消。

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

提前致谢。

标签: c#async-await

解决方案


创建任务时,将其存储在某处。如果您计划创建多个任务,则可能需要一个集合来存储它们。例如,您可以将其存储在 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);

但是,如果可能,更好的解决方案是处理异常。


推荐阅读