2011-12-16 61 views
4

本地任務引用在超出作用域並且垃圾收集器決定在任務完成之前擺脫它時會發生什麼?處置任務會發生什麼情況?

基本上我問,如果它是安全的,使這種服務調用實現的:

/// <summary> 
/// Web service operation to start a large batch asynchronously 
/// </summary>  
public StartBatchResponseMessage StartBatch(StartBatchRequestMessage request) 
{ 
    Task t = Task.Factory.StartNew(DoWork); 
    return new StartBatchResponseMessage(); 
} 

private void DoWork() 
{ 
    // Implement solving world hunger here. 
} 

DoWork的意志總是在這個例子中完成?即使垃圾收集器決定處置Task實例變量t?

如果不是,那麼實現這種功能的更安全的方法是什麼?

+0

要小心你如何使用「處置」這個詞。不要與`IDisposable`模式混淆。 – Gusdor 2014-01-25 11:40:44

回答

9

是的,它會運行。如果您反編譯您的代碼,您可以看到Task.Factory.StartNew調用Task.InternalStartNew的呼叫,它調用Task.ScheduleAndStart(false)

這又調用task.m_taskScheduler.QueueTask(this),根據MSDN將任務添加到內部結構 - 這當然會阻止它被垃圾收集。這完全如你所願。

+0

這是對發生的事情的深入描述。認爲它會以這種方式工作,但從不傷害,以確保。謝謝!這是你沒有被警告在使用語句中運行任務的原因嗎? – nicojs 2011-12-16 12:50:45

1

是的,任務將始終完成。垃圾收集器在任務運行時不會到達其相關部分。

3

常識,你知道的。任務庫必須以某種方式調用你的方法,所以它必須保留一個引用,否則它不能調用它。顯然,這個引用可以防止垃圾回收。

基本上,你得到的「任務」是指向Task對象的指針,內部執行引擎也必須引用該對象,否則它將永遠不會被執行。

因此,由於參考文獻不是你的t變量,所以它不會被丟棄。

相關問題