2011-03-06 43 views
64

我只是想知道dot.net 4中的新任務類是創建一個背景或前景線程?任務是否創建爲後臺線程?

通常情況下,我會在線程上設置「IsBackground」,但Task上沒有這樣的屬性。

我已經無法找到這在MSDN上的任何文件:-(

回答

94

應該不是很難驗證:

class Program 
{ 
    static void Main() 
    { 
     Task 
      .Factory 
      .StartNew(() => Console.WriteLine(Thread.CurrentThread.IsBackground)) 
      .Wait(); 
    } 
} 

答案是...

ǝnɹʇ

+2

+1沒有想到這個 - 好方法:-) – Steffen 2011-03-06 09:07:41

+0

我有一個問題,我的所有任務都在調用線程上運行。我將上述精確的代碼行粘貼到我的項目中,並報告「錯誤」。你知道這可能是爲什麼嗎?我正在使用.NET 4.0。 – 2013-04-11 17:37:56

+7

根據這個線程http://stackoverflow.com/questions/7889746/creating-threads-task-factory-startnew-vs-new-thread你不能保證後臺線程開始任務時,但你應該是如果你使用TaskCreationOptions.LongRunning。我正在使用該選項,但它仍未創建後臺線程。是什麼賦予了? – 2013-04-11 17:43:02

3

如果你指的是使用asyncawait關鍵字開始Task<T>,那麼答案是否定的。從here摘錄:。

「異步和等待關鍵字不會導致創建額外的線程異步方法不需要多線程,因爲異步方法不會在自己的線程上運行的方法對當前運行同步上下文,並且只在該方法處於活動狀態時纔在線程上使用時間。可以使用Task.Run將CPU綁定的工作移動到後臺線程,但後臺線程無助於只等待結果成爲過程的進程可用「。

+0

Task.Run(async()=> {....})???那麼,我用'async' – deadManN 2017-10-11 06:47:53

0

任務由來自系統線程池的線程執行。來自線程池的線程默認在後臺執行。

0

如果你還不相信一個後臺任務的,只是儘量在任務中從訪問GUI元素,如:

public async Task<int> ProcessStuff_Async() 
{ 
    while(true) 
    { 
     label1.Text = "processing next item"; 

獲得運行時異常:

交叉線程操作無效: 控制'label1'從其創建線程以外的線程訪問。

就像擁有良好的舊常規後臺線程一樣。

有一個在MSDN docs信息(截至2017年:-),例如:

來處理這種情況的最好方法......是啓動後臺線程這 不使用任務工作。運行等待其結果。這將允許 UI在工作完成時感覺平穩。

該文檔甚至有一個部分What happens under the covers

相關問題