c# - 窗口关闭时正在运行的任务会发生什么情况?

标签 c# wpf task dispose

我有三个页面:

Page1 继承自 Window 类。 Page2和Page3继承自UserControl类。

当我从 Page1 转到 Page2 时,我用两个 Tasks 处理两个长处理对象:

var task1 = Task.Factory.StartNew(() => MyObject1.Dispose());
var task2 = Task.Factory.StartNew(() => MyObject2.Dispose());
List<Task> tasks = new List<Task>();
tasks.Add(task1);
tasks.Add(task2);
//    Task.WaitAll(tasks.ToArray()); 

Page2 和 3 上的代码相同。 如果用户关闭 Page1、2 或 3 会发生什么? 当 Page 关闭时,我的任务仍然会运行吗?还是它也坏了? 我应该使用 Dispatcher 而不是 Task 吗?

谢谢!

最佳答案

没有 a good, minimal, complete code example 就无法准确说出.这取决于窗口关闭时还会发生什么。通常,如果进程仍然存在,那么任务也将存在。该窗口本身并不“拥有”任务,关闭它也不会导致任何这些任务被中断。

但是 TaskFactory.StartNew() 在线程池中运行您的委托(delegate)调用。当进程中不再有任何前台线程时,后台线程(如线程池中的线程)与进程本身一起终止。如果关闭窗口导致进程中唯一的前台线程退出,那么您的所有任务以及进程的其余部分都会停止。

在这两种情况之间,还有很多其他的可能性。以上所有内容都假定您自己的代码不会尝试干扰默认机制。如果这两种解释似乎不适用于您的情况,请提供一个很好的代码示例并澄清您的问题。

关于c# - 窗口关闭时正在运行的任务会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34059478/

相关文章:

c# - 无法将类型为 'CaSTLe.Proxies.XProxy' 的对象转换为 WPF 设计器中的类型 'X'

c# - 将方法放入任务中以避免阻塞 asp.net 线程

c# - 如何确保所有任务都已执行并查询最终结果

c# - ASP.NET DropDownList AutoPostback 不工作——我错过了什么?

C# for循环显示所有记录

c# - 使用 DataContext 作为 <Binding> 的 Path 属性

c# - 使用 WPF 工具包绑定(bind)饼图不显示点

c# - 异步/等待抛出未处理的异常

javascript - 如何制作自定义 HTML Helper?

wpf - 如果用户尝试通过键盘或鼠标选中/取消选中复选框,如何采取行动?