Ho trovato un codice che utilizza la condizione Task.WaitAny.Task WaitTutte le condizioni
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();
}
Il codice funziona bene, il risultato è 2 1 3.
Quando ho provato a cambiare gli intervalli di sonno
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();
}
ho avuto 1 2 3, nonostante il numero compito due è il uno con il più piccolo tempo di sonno e dovrebbe essere quello rimosso per primo.
Cosa sta succedendo sotto il cofano?
Forse qualche problema di temporizzazione. Aumentare gli intervalli di sonno di 10 volte per escluderlo. – usr
Impossibile riprodurre - Ottengo "(pausa) 2,3 (pausa) 1" o "(pausa) 3,2 (pausa) 1" - come previsto. Quanti core hai sul tuo PC? È possibile che ci sia bisogno di tempo per far salire i lavoratori perché hai un single-core? –
btw, il 1000, 1000 è un refuso? uno di questi dovrebbe essere 3000? –