Ich bearbeite eine Liste von Artikeln (200k - 300k), jede Artikel Bearbeitungszeit liegt zwischen 2 bis 8 Sekunden. Um Zeit zu gewinnen, kann ich diese Liste parallel bearbeiten. Wie ich in einem Asynchron-Kontext bin, verwende ich so etwas wie diese:C# Parallel Foreach + Async
public async Task<List<Keyword>> DoWord(List<string> keyword)
{
ConcurrentBag<Keyword> keywordResults = new ConcurrentBag<Keyword>();
if (keyword.Count > 0)
{
try
{
var tasks = keyword.Select(async kw =>
{
return await Work(kw).ConfigureAwait(false);
});
keywordResults = new ConcurrentBag<Keyword>(await Task.WhenAll(tasks).ConfigureAwait(false));
}
catch (AggregateException ae)
{
foreach (Exception innerEx in ae.InnerExceptions)
{
log.ErrorFormat("Core threads exception: {0}", innerEx);
}
}
}
return keywordResults.ToList();
}
Die Keyword-Liste immer 8 Elemente enthält (von oben kommend) so verarbeite ich meine Liste von 8 mal 8, aber in diesem Fall, ich denke, Wenn 7 Stichwörter in 3 Sekunden verarbeitet werden und der 8. in 10 Sekunden verarbeitet wird, beträgt die Gesamtzeit für die 8 Stichwörter 10 (korrigieren Sie mich, wenn ich falsch liege). Wie kann ich von der Parallel.Foreach
dann nähern? Ich meine: starte 8 Schlüsselwörter, wenn 1 von ihnen fertig ist, starte 1 weitere. In diesem Fall habe ich 8 Arbeitsprozesse permanent. Irgendeine Idee ?
Haben Sie darüber nachgedacht, mit [ 'TPL DataFlow'] (https://msdn.microsoft.com/en-us /library/hh228603(v=vs.110).aspx) um eine Pipeline zur Verarbeitung der Elemente einzurichten? –
es klingt wie das ist, was Sie suchen https://msdn.microsoft.com/en-us/library/system.threading.tasks.paralleloptions.maxdegreeofparallelism(v=vs.110).aspx –
@MatthewWatson, Ich habe es gerade Existenz erfahren, ich werde das überprüfen, danke! – Gun