beginne ich ein paar parallele Aufgaben, wie folgt aus:Gibt es eine generische Task.WaitAll?
var tasks =
Enumerable.Range(1, 500)
.Select(i => Task.Factory.StartNew<int>(ProduceSomeMagicIntValue))
.ToArray();
und dann kommen Sie mit
Task.WaitAll(tasks);
Auf dieser letzten Zeile ich eine tasks
unter verschnörkelten Marker blau bekommen, mit einer Warnmeldung:
Co-variant array conversion from Task[] to Task[] can cause run-time exception on write operation.
Ich verstehe, warum ich diese Botschaft bekomme, aber gibt es einen Weg dahin? (Zum Beispiel, wie eine generische Version von Task.WaitAll()
?)
In diesem Fall ist die Konvertierung sicher, weil 'WaitAll()' nicht in das Array schreiben wird. Gibt es einen Grund, warum Sie es vermeiden wollen? – svick
.Net 4.5 enthält auch ['Task.WhenAll()'] (http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.whenall%28v=vs.110% 29.aspx), die eine einzelne "Aufgabe" zurückgibt, die abgeschlossen wird, wenn alle Aufgaben in der Sammlung abgeschlossen sind. Und es hat auch eine generische Version und es funktioniert auf jedem 'IEnumerable' von 'Task's. –
svick
@svick thx für den Tipp. sieht so aus, als hätten sie das, worüber du sprichst, in WhenAll umbenannt, also kannst du einfach 'appear task' sagen.WhenAll (Aufgabe1, Aufgabe2); ' –