【问题标题】:System.Threading.Tasks.TaskCanceledException was unhandled in C#System.Threading.Tasks.TaskCanceledException 在 C# 中未处理
【发布时间】:2018-06-20 02:20:20
【问题描述】:

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

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

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

提前致谢。

【问题讨论】:

  • "关闭窗口我使用了 Environment.Exit(0);"不是... Window.Close??

标签: c# async-await


【解决方案1】:

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

不过,更好的解决方案是尽可能处理异常。

【讨论】:

  • 谢谢。但是有没有办法得到所有未完成的任务列表?
  • 我在这里得到的异常来自外部代码,我无法控制。有什么办法可以抑制它。
  • 也许再读一遍?我提供的代码示例包含检测尚未完成的任务的逻辑。
  • 我一直在使用许多任务,我将它们全部存储并检查。但我找不到任何无人看管的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多