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?
Vielleicht etwas Timing-Problem. Erhöhe die Schlafintervalle um das 10-fache, um dies zu verhindern. – usr
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? –
BTW, ist die 1000, 1000 ein Tippfehler? sollte einer von denen 3000 sein? –