我只是想知道dot.net 4中的新任務類是創建一個背景或前景線程?任務是否創建爲後臺線程?
通常情況下,我會在線程上設置「IsBackground」,但Task上沒有這樣的屬性。
我已經無法找到這在MSDN上的任何文件:-(
我只是想知道dot.net 4中的新任務類是創建一個背景或前景線程?任務是否創建爲後臺線程?
通常情況下,我會在線程上設置「IsBackground」,但Task上沒有這樣的屬性。
我已經無法找到這在MSDN上的任何文件:-(
應該不是很難驗證:
class Program
{
static void Main()
{
Task
.Factory
.StartNew(() => Console.WriteLine(Thread.CurrentThread.IsBackground))
.Wait();
}
}
答案是...
ǝnɹʇ
任務由來自系統線程池的線程執行。來自線程池的線程默認在後臺執行。
如果你還不相信一個後臺任務的,只是儘量在任務中從訪問GUI元素,如:
public async Task<int> ProcessStuff_Async()
{
while(true)
{
label1.Text = "processing next item";
獲得運行時異常:
交叉線程操作無效: 控制'label1'從其創建線程以外的線程訪問。
就像擁有良好的舊常規後臺線程一樣。
有一個在MSDN docs信息(截至2017年:-),例如:
來處理這種情況的最好方法......是啓動後臺線程這 不使用任務工作。運行和等待其結果。這將允許 UI在工作完成時感覺平穩。
該文檔甚至有一個部分What happens under the covers
。
+1沒有想到這個 - 好方法:-) – Steffen 2011-03-06 09:07:41
我有一個問題,我的所有任務都在調用線程上運行。我將上述精確的代碼行粘貼到我的項目中,並報告「錯誤」。你知道這可能是爲什麼嗎?我正在使用.NET 4.0。 – 2013-04-11 17:37:56
根據這個線程http://stackoverflow.com/questions/7889746/creating-threads-task-factory-startnew-vs-new-thread你不能保證後臺線程開始任務時,但你應該是如果你使用TaskCreationOptions.LongRunning。我正在使用該選項,但它仍未創建後臺線程。是什麼賦予了? – 2013-04-11 17:43:02