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,雖然任務數量二是睡眠時間最短的一個,應該是首先被移除的一個。
引擎蓋下發生了什麼?
也許有些時間問題。將睡眠間隔增加10倍以排除。 – usr
無法重現 - 按預期得到「(暫停)2,3(暫停)1」或「(暫停)3,2(暫停)1」。你的電腦上有多少核心?因爲您擁有單核心,是否有可能需要時間來激勵員工? –
順便說一句,1000,1000是一個錯字嗎?如果其中之一是3000? –