2013-10-08 58 views
5

我發現一些使用Task.WaitAny條件的代碼。任務等待任何條件

Task<int>[] tasks = new Task<int>[3]; 

tasks[0] = Task.Run(() => { Thread.Sleep(2000); return 1; }); 
tasks[1] = Task.Run(() => { Thread.Sleep(1000); return 2; }); 
tasks[2] = Task.Run(() => { Thread.Sleep(3000); return 3; }); 

while (tasks.Length > 0) { 
    int i = Task.WaitAny(tasks); 
    Task<int> completedTask = tasks[i]; 

    Console.WriteLine(completedTask.Result); 

    var temp = tasks.ToList(); 
    temp.RemoveAt(i); 
    tasks = temp.ToArray(); 
} 

的代碼工作正常,結果爲2 1 3

當我試圖改變睡眠間隔

tasks[0] = Task.Run(() => { Thread.Sleep(2000); return 1; }); 
tasks[1] = Task.Run(() => { Thread.Sleep(1000); return 2; }); 
tasks[2] = Task.Run(() => { Thread.Sleep(1000); return 3; }); 

while (tasks.Length > 0) { 
    int i = Task.WaitAny(tasks); 
    Task<int> completedTask = tasks[i]; 

    Console.WriteLine(completedTask.Result); 

    var temp = tasks.ToList(); 
    temp.RemoveAt(i); 
    tasks = temp.ToArray(); 
} 

我1 2 3,雖然任務數量二是睡眠時間最短的一個,應該是首先被移除的一個。

引擎蓋下發生了什麼?

+1

也許有些時間問題。將睡眠間隔增加10倍以排除。 – usr

+4

無法重現 - 按預期得到「(暫停)2,3(暫停)1」或「(暫停)3,2(暫停)1」。你的電腦上有多少核心?因爲您擁有單核心,是否有可能需要時間來激勵員工? –

+1

順便說一句,1000,1000是一個錯字嗎?如果其中之一是3000? –

回答

1

Thread.Sleep在暫停程序達到指定的毫秒數時相當準確。

Thread.Sleep(1000)表示任務將在1000毫秒後執行。

但是,首先要從所有可用任務中執行哪個任務由任務調度程序決定,它根據線程池中的線程數量和許多其他因素來決定任務的執行順序。