我有三页:
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
?
谢谢!
答案 0 :(得分:3)
没有a good, minimal, complete code example就不可能说出来。这取决于窗口关闭时还会发生什么。一般来说,如果流程仍然存在,那么任务也是如此。窗口本身不“拥有”任务,也不会关闭它导致任何这些任务被中断。
但TaskFactory.StartNew()
在线程池中运行您的委托调用。当进程中不再有任何前台线程时,后台线程(如线程池中的线程)与进程本身一起终止。如果关闭窗口导致进程中唯一的前台线程退出,那么您的任务将全部停止,以及该过程的其余部分。
在这两种情景之间,还有很多其他可能性。以上所有假设您自己的代码不会尝试干扰默认机制。如果这两种解释似乎不适用于您的情况,请提供一个很好的代码示例并澄清您的问题。
答案 1 :(得分:3)
当Page关闭时,我的任务会不会运行?
如果您的问题是“我的任务根植于某处,以便在垃圾收集开始时,它们将无法收集资格”然后答案是肯定的,假设您的流程未终止通过关闭它运行消息循环的前台线程。
任务在线程池上排队,它保留对它们的引用,或者如果它们已经在执行,那么它们就会被线程的堆栈生根,这将使它们保持活动状态直到它们完成。
我会这样说:如果你需要在后台线程上执行IDisposable.Dispose
方法,我会说你正在做一些固有的错误。处置方法应该不再是处理非托管资源。