Window关闭时运行任务会发生什么?

时间:2015-12-03 06:47:03

标签: 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()); 

第2页和第3页上的相同代码。 如果用户关闭Page1,2或3会发生什么? 当Page关闭时,我的任务会不会运行?还是它也打破了? 我使用Dispatcher代替Task

谢谢!

2 个答案:

答案 0 :(得分:3)

没有a good, minimal, complete code example就不可能说出来。这取决于窗口关闭时还会发生什么。一般来说,如果流程仍然存在,那么任务也是如此。窗口本身不“拥有”任务,也不会关闭它导致任何这些任务被中断。

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

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

答案 1 :(得分:3)

  

当Page关闭时,我的任务会不会运行?

如果您的问题是“我的任务根植于某处,以便在垃圾收集开始时,它们将无法收集资格”然后答案是肯定的,假设您的流程未终止通过关闭它运行消息循环的前台线程。

任务在线程池上排队,它保留对它们的引用,或者如果它们已经在执行,那么它们就会被线程的堆栈生根,这将使它们保持活动状态直到它们完成。

我会这样说:如果你需要在后台线程上执行IDisposable.Dispose方法,我会说你正在做一些固有的错误。处置方法应该不再是处理非托管资源。