2016-10-12 42 views
1

在我的計劃,我有〜40正在運行的任務,等被定義:Task.Run花費很多時間來啓動任務

private void StartTryReconnectTask() { 
     TryReconnectCTKS = new CancellationTokenSource(); 
     TryReconnectTask = new Task(this.TryReconnect, TryReconnectCTKS.Token); 
     TryReconnectTask.Start(); 
} 

內TryReconnect()有一個無限while循環停止,只有當任務取消。在這裏,一切似乎都很好。

然後,我需要點擊一個按鈕啓動任務(不是無限的):

private void ExecuteRepairCommand(object o) { 
     Task.Run(() => { 
     ... 
     }); 
    } 

要花〜四十○分之三十○秒鐘就可以啓動這個新的任務。 如果我使用線程一切正常,線程立即啓動。爲什麼?原因是什麼?

+0

我認爲這可能是異步的事情或缺乏他們的,我不認爲它開始後30-40秒,那是當它完成。也許嘗試使ExecuteRepairCommand異步,然後等待任務。 –

+0

創建任務時使用'TaskCreationOptions.LongRunning'標誌。 –

+0

@SriramSakthivel哇謝謝你!你可以發佈答案,所以我可以標記它是正確的嗎? – rmbq

回答

6

默認情況下,任務被調度爲ThreadPool。當您安排大量任務時,ThreadPool不會創建新線程。它會在創建新線程之前等待一段時間(基於一些啓發式)。這就是爲什麼你注意到你的任務開始延遲。 I've explained it earlier here

回到你的問題。如果你的任務長時間運行,你應該考慮使用LongRunning標誌。它會指示任務計劃程序給它一個新的線程;所以你的任務可以長時間獨立運行而不會影響其他任務。

Task.Factory.StartNew(() => 
{ 
    ... 
}, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);