2015-12-03 83 views
2

我有三個頁面:窗戶關閉時運行任務會發生什麼?

Page1繼承自Window類。 第2頁和第3頁繼承自UserControl類。

,當我從第一頁到第2頁我處置兩條長長的配置對象有兩個Tasks:如果用戶關閉Page1,2或3

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 會發生什麼? 頁面關閉時,我的任務會繼續運行嗎?或者它也打破了? Shound我使用Dispatcher而不是Task

謝謝!

回答

3

不可能精確地說,沒有a good, minimal, complete code example。這取決於窗戶關閉時會發生什麼。一般來說,如果這個過程仍然存在,任務也是如此。窗口本身並不「擁有」任務,也不會關閉它導致任何這些任務被中斷。

TaskFactory.StartNew()在線程池中運行您的委託調用。當進程中不再有前臺線程時,後臺線程(如線程池中的那些線程)會與進程本身一起被終止。如果關閉窗口會導致進程中唯一的前景線程退出,那麼您的任務都會停止,以及進程的其餘部分。

在這兩種情況之間,還有很多其他的可能性。以上所有假設您自己的代碼不會嘗試干擾默認機制。如果這兩種解釋似乎不適用於您的情況,請提供一個很好的代碼示例並澄清您的問題。

3

當頁面關閉時,我的任務會繼續運行嗎?

如果你的問題是「是我的任務紮根的地方,使得垃圾收集開始的時候,他們不會eligable收集」那麼答案是肯定的,asssuming過程不通過關閉終止它的前景運行消息循環的線程。

任務在線程池中排隊,線程池保留對它們的引用,或者如果它們已經在執行,那麼它們被線程的堆棧所取代,這將使它們保持活動狀態直到它們完成。

我會這樣說:如果你需要在後臺線程上執行您的IDisposable.Dispose方法,我說你正在做的事情固有錯誤。處置方法不應該只是處理非託管資源。

相關問題