当窗口关闭时,运行任务会发生什么

本文关键字:任务 什么 运行 窗口 | 更新日期: 2023-09-27 18:25:30

我有三个页面:

Page1继承自Window类。Page2和Page3继承自CCD_ 2类。

当我从第1页转到第2页时,我用两个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()); 

第2页和第3页的代码相同。如果用户关闭Page1,2或Page3会发生什么?页面关闭时,我的任务还会运行吗?或者它也坏了?我应该用Dispatcher而不是Task吗?

谢谢!

当窗口关闭时,运行任务会发生什么

如果没有一个好的、最小的complete代码示例,就不可能准确地说。这取决于窗口关闭时还会发生什么。一般来说,如果进程仍然存在,那么任务也会存在。窗口本身并不"拥有"任务,关闭它也不会导致任何任务中断。

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

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

页面关闭时,我的任务还会运行吗?

如果您的问题是"我的任务是否植根于某个地方,以至于当垃圾收集开始时,它们将无法用于收集",那么答案是肯定的,确保您的进程不会通过关闭运行消息循环的前台线程而终止

任务在线程池中排队,线程池保留对它们的引用,或者如果它们已经在执行,则它们由线程的堆栈进行根操作,这将使它们保持活动状态,直到它们完成。

我想说的是:如果你需要在后台线程上执行IDisposable.Dispose方法,我会说你做了一些本质上错误的事情。处置方法不应超过对非托管资源的处置。