c# - System.Threading.Tasks.TaskCanceledException 在 C# 中未处理
问题描述
要关闭窗口,我使用了 Environment.Exit(0); 我得到如下错误:
System.Threading.Tasks.TaskCanceledException 未处理 消息:WindowsBase.dll 中出现“System.Threading.Tasks.TaskCanceledException”类型的未处理异常附加信息:任务已取消。
在我关闭窗口之前,有什么方法可以检查任何任务是否仍在运行?
提前致谢。
俊
解决方案
创建任务时,将其存储在某处。如果您计划创建多个任务,则可能需要一个集合来存储它们。例如,您可以将其存储在 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);
但是,如果可能,更好的解决方案是处理异常。
推荐阅读
- cmake - 复制头文件的 add_custom_command 不起作用
- php - Laravel hasMany 来自同一张表的先决条件
- java - 按下删除按钮时如何获取相应的名称
- python - 尝试使用 Spinbox 和 RadioButtons 将列表的一部分添加到另一部分
- c# - C# wpf 如何将变量 Excel.Worksheet 从 Button_Click 传递到另一个 Button_Click
- path - 关于图论中路径定义的困惑
- express - 如何不在 expressjs 上监听 3000 端口?
- java - 如何将多部分文件转换为java中的文件
- javascript - 当绘制 2 个甜甜圈时,D3JS 图形甜甜圈未显示一些楔形
- sql-server - 在 SQL Server 中筛选多行