2013-10-08 8 views
5

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?

+1

Forse qualche problema di temporizzazione. Aumentare gli intervalli di sonno di 10 volte per escluderlo. – usr

+4

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? –

+1

btw, il 1000, 1000 è un refuso? uno di questi dovrebbe essere 3000? –

risposta

1

Thread.Sleep è abbastanza preciso nel mettere in pausa il programma per il numero specificato di millisecondi.

Thread.Sleep (1000) indica che l'attività sarà disponibile per l'esecuzione dopo 1000 millisecondi.

Ma quale compito deve essere eseguito prima da tutte le attività disponibili è deciso dall'utilità di pianificazione, esso decide l'ordine di esecuzione dell'attività in base al numero di thread nel pool di thread e molti altri fattori.