Ich versuche, eine asynchrone Konsole App zu erstellen, die einige Arbeiten an einer Sammlung ausführt. Ich habe eine Version, die parallele for-Schleife eine andere Version verwendet, die async/erwartet verwendet. Ich erwartete, dass die async/await-Version ähnlich wie die parallele Version funktioniert, aber synchron ausgeführt wird. Was mache ich falsch?Verwendung in einer Schleife erwarten
class Program
{
static void Main(string[] args)
{
var worker = new Worker();
worker.ParallelInit();
var t = worker.Init();
t.Wait();
Console.ReadKey();
}
}
public class Worker
{
public async Task<bool> Init()
{
var series = Enumerable.Range(1, 5).ToList();
foreach (var i in series)
{
Console.WriteLine("Starting Process {0}", i);
var result = await DoWorkAsync(i);
if (result)
{
Console.WriteLine("Ending Process {0}", i);
}
}
return true;
}
public async Task<bool> DoWorkAsync(int i)
{
Console.WriteLine("working..{0}", i);
await Task.Delay(1000);
return true;
}
public bool ParallelInit()
{
var series = Enumerable.Range(1, 5).ToList();
Parallel.ForEach(series, i =>
{
Console.WriteLine("Starting Process {0}", i);
DoWorkAsync(i);
Console.WriteLine("Ending Process {0}", i);
});
return true;
}
}
Ich weiß nicht über andere, aber eine Parallele für Foreach scheint für parallele Schleifen einfacher. – Brettski
Wichtig, wenn Sie sehen, dass die 'Ending Process' Benachrichtigung nicht ** ist, wenn die Aufgabe tatsächlich endet. Alle diese Benachrichtigungen werden nacheinander ausgegeben, unmittelbar nachdem der * letzte * der Aufgaben abgeschlossen ist. Zu dem Zeitpunkt, an dem Sie "Prozess 1 beenden" sehen, war Prozess 1 möglicherweise für eine lange Zeit vorbei. Anders als die Wahl der Wörter dort, +1. –
@Brettski Ich kann falsch liegen, aber eine parallele Schleife schließt alle asynchronen Ergebnisse ein. Durch das Zurückgeben einer Task erhalten Sie sofort ein Task-Objekt zurück, in dem Sie die Arbeit, die gerade ausgeführt wird, verwalten können, z. B. Abbrechen oder Anzeigen von Ausnahmen. Jetzt mit Async/Await können Sie mit dem Task-Objekt freundlicher arbeiten - das heißt, Sie müssen Task.Result nicht ausführen. –