항목 목록 (200k - 300k)을 처리 중이며 각 항목 처리 시간은 2 - 8 초입니다. 시간을 벌기 위해이 목록을 병렬로 처리 할 수 있습니다. 내가 비동기 상황에있어, 나는 이런 식으로 뭔가를 사용C# 병렬 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