2013-10-08 3 views
5

Ich habe einen Code gefunden, der die Task.WaitAny-Bedingung verwendet.Task WaitAny Bedingung

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(); 
} 

Der Code funktioniert gut, ist das Ergebnis 2 1 3.

Als ich versuchte, die Schlafintervalle

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(); 
} 

I 1 2 3 muss sich ändern, trotz Aufgabe Nummer zwei der ist eines mit der kleinsten Schlafzeit und sollte zuerst entfernt werden.

Was passiert unter der Haube?

+1

Vielleicht etwas Timing-Problem. Erhöhe die Schlafintervalle um das 10-fache, um dies zu verhindern. – usr

+4

Kann nicht reproduzieren - ich bekomme "(Pause) 2,3 (Pause) 1" oder "(Pause) 3,2 (Pause) 1" - wie erwartet. Wie viele Kerne haben Sie auf Ihrem PC? Ist es möglich, dass es Zeit braucht, um Arbeiter hochzufahren, weil Sie einen Single-Core haben? –

+1

BTW, ist die 1000, 1000 ein Tippfehler? sollte einer von denen 3000 sein? –

Antwort

1

Thread.Sleep ist ziemlich genau das Programm für die angegebene Anzahl von Millisekunden pausieren.

Thread.Sleep (1000) bedeutet, dass die Task nach 1000 Millisekunden zur Ausführung verfügbar ist.

Aber welche Aufgabe zuerst von allen verfügbaren Aufgaben auszuführen ist, entscheidet der Aufgabenplaner, sie entscheidet über die Reihenfolge der Ausführung der Aufgabe basierend auf der Anzahl der Threads im Thread-Pool und vielen anderen Faktoren.