アイテムのリスト(200k〜300k)を処理していますが、各アイテムの処理時間は2〜8秒です。時間を得るために、私はこのリストを並行して処理することができます。私は非同期コンテキストにいるように、私はこのようなものを使用します。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();
}
キーワードリストは常に8つの要素(上から来)が含まれていので、私は8で私のリスト8を処理しますが、この場合には、私は推測します7つのキーワードが3秒で処理され、8番目のキーワードが10秒で処理される場合、8つのキーワードの合計時間は10(私が間違っている場合は正しい)になります。 どうすればParallel.Foreach
に近づけることができますか?つまり、1つが実行されている場合は8個のキーワードを起動し、1個を起動するとします。この場合、私は8つの作業プロセスを永久に持っていきます。何か案が ?
は、あなたが使用して考えられている[ 'TPL DataFlow'](https://msdn.microsoft.com/en-us /library/hh228603(v=vs.110).aspx)アイテムを処理するパイプラインを設定するには? –
これはあなたが探しているようですね。https://msdn.microsoft.com/en-us/library/system.threading.tasks.paralleloptions.maxdegreeofparallelism(v=vs.110).aspx –
@MatthewWatson、私はちょうどそれが存在を学んだ、私はこれを確認します、ありがとう! – Gun