Ich habe für einige Projekte auf .net Core umgeschaltet und habe jetzt ein Problem mit Parallel.ForEach. In der Vergangenheit hatte ich oft eine Liste von ID-Werten, die ich dann verwenden würde, um Web-Anfragen zu stellen, um die vollständigen Daten zu erhalten. Es würde wie folgt aussehen:.net Core Parallel.ForEach Ausgaben
Parallel.ForEach(myList, l =>
{
// make web request using l.id
// process the data somehow
});
Nun, in .net Kern die Webanfragen alle await
markiert werden müssen, die die Parallel.ForEach Aktion bedeutet, muss mit async
markiert werden. Aber das Markieren einer Parallel.ForEach-Aktion als async
bedeutet, dass wir eine void async
-Methode haben, die Probleme verursacht. In meinem speziellen Fall bedeutet dies, dass die Antwort zu der Anwendung zurückkehrt, bevor alle Webanforderungen in der parallelen Schleife abgeschlossen sind, was sowohl umständlich ist als auch Fehler verursacht.
Frage: Was sind die Alternativen zur Verwendung von Parallel.ForEach hier?
Eine mögliche Lösung fand ich war die Parallel-Schleife innerhalb einer Aufgabe und wartet auf die Aufgabe zu wickeln:
await Task.Run(() => Parallel.ForEach(myList, l =>
{
// stuff here
}));
(hier: Parallel.ForEach vs Task.Run and Task.WhenAll)
Aber, das nicht für mich funktioniert . Wenn ich das benutze, komme ich immer noch zur Anwendung zurück, bevor die Schleife abgeschlossen ist.
Eine weitere Option:
var tasks = new List<Task>();
foreach (var l in myList)
{
tasks.Add(Task.Run(async() =>
{
// stuff here
}));
}
await Task.WhenAll(tasks);
Dies scheint zu arbeiten, aber ist, dass die einzige Option? Es scheint, dass der neue .net-Core Parallel.ForEach praktisch nutzlos gemacht hat (zumindest wenn es um verschachtelte Web-Aufrufe geht).
Jede Hilfe/Beratung wird geschätzt.
'async/await' wurde für lange und blockierende ** I/O-Operationen ** entwickelt, während' Parallel' für lange und blockierende ** CPU-Operationen ** entwickelt wurde. Wenn Sie versuchen, asynchronen Code innerhalb eines 'Parallel'-Funktionskörpers zu schreiben, dann machen Sie etwas falsch. Erwägen Sie stattdessen, [Task.WhenAll] (https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.whenall (v = vs.110) .aspx) zu verwenden. –
Zusätzlich zu obigen Kommentar, wenn Sie Task.Run (async() => ...), Sie auch fast immer etwas falsch machen. – Evk
Sie sollten sich [TPL Dataflow] (https://msdn.microsoft.com/en-us/library/hh228603 (v = vs.110) .aspx) ansehen. Macht dein Leben viel einfacher. Es ist kein Teil des .NET Frameworks, aber Sie können nuget verwenden, um es zu bekommen, – ThePerplexedOne