Ich habe folgenden Synchroncode:Konvertieren Schleife Aufgaben
foreach (var step in result) {
step.Run();
}
Ich habe versucht, es zu Aufgaben zu konvertieren, aber ich nicht tun. Ich habe versucht, es zu konvertieren Task.WhenAll
wie folgt aus (und ich habe async der Methode Signatur anhängen):
var tasks = new List<Task>();
foreach (var step in result) {
tasks.Add(new Task(() => step.Run()));
}
await Task.WhenAll(tasks);
Dieser kehrt sofort zurück und stellt die Run()
Methode nicht ausgeführt werden. Dann habe ich versucht, es in den folgenden Code zu konvertieren:
Dies blockiert für immer. Allerdings, wenn ich ein innerhalb der Schleife erstellen funktioniert es:
foreach (var step in result) {
var t = Task.Run(() => step.Run());
t.Wait();
}
Wenn ich stattdessen await Task.Run(() => step.Run());
es wartet nur die ersten und nimmt den Haupt-Thread.
Die run-Methode sieht wie folgt aus:
public async void Run() {
var result = Work();
if (null != result && result.Count > 0) {
var tasks = new List<Task>();
foreach (var step in result) {
await Task.Run(() => step.Run());
}
}
}
Alle Schritte, um eine Arbeit() Methode implementieren (die in einer Basisklasse abstrakt ist). Mein erster Schritt sieht wie folgt aus:
class NoWorkStep : WorkerStep {
protected override IList<WorkerStep> Work() {
Console.WriteLine("HERE");
List<WorkerStep> newList = new List<WorkerStep>();
for (int i = 0; i < 10; i++) {
newList.Add(new NoWorkStep2());
}
return newList;
}
}
Und meine zweite Schritt sieht wie folgt aus:
class NoWorkStep2 : WorkerStep {
protected override IList<WorkerStep> Work() {
Console.WriteLine("HERE-2");
return new List<WorkerStep>();
}
}
ich einfach eine Instanz von NoWorkStep erstellen und instance.Run()
nennen.
Wo habe ich ein Problem mit der Ausführung der Schritte mit Task.WhenAll
?
Edit: Code aufrufen, nachdem ich die Run-Methode zu async Task RunAsync
geändert:
private static async void doIt() {
var step = new NoWorkStep();
await step.RunAsync();
}
async _void_ Ausführen()? – Ewan
Verwenden Sie keine 'neue Aufgabe'. Der Grund, warum Ihr viertes Beispiel funktioniert, liegt nicht daran, dass 'Wait' innerhalb des Zyklus ist - es funktioniert, weil Sie' Task.Run' anstelle von 'neue Aufgabe' verwenden. – Luaan