2011-10-25 6 views
78

현재 프로젝트에서 TPL을 사용하고 Parallel.Foreach를 사용하여 많은 스레드를 돌립니다. Task 클래스에는 작업이 완료 될 때까지 대기 할 Wait()이 포함됩니다. 이와 같이 Parallel.ForEach가 완료 될 때까지 기다렸다가 다음 문장을 실행하는 방법은 무엇입니까?Parallel.ForEach가 완료 될 때까지 기다릴 수있는 방법

답변

132

특별한 작업을 수행 할 필요가 없습니다. Parallel.Foreach()은 분기 된 모든 작업이 완료 될 때까지 대기합니다. 호출 스레드에서 단일 동기 문으로 처리 할 수 ​​있으며 예를 들어 try/catch 내부에 랩핑 할 수 있습니다.

+2

가 어떤 상황에서 혼동 될 수있다 "Parallel.Foreach()가 모든 분기 작업이 완료 될 때까지 기다릴 것"같은 (비동기 작업 내부를) 찾을 수 있습니다 비동기 unreadMsgCollection => {/ * 작동 * /}); –

+0

여기에 stackoverflow의 다른 문제 : http://stackoverflow.com/questions/11564506/nesting-await-in-parallell-foreach –

+1

이 대답은 async/await 전에 2011 년부터입니다. 하지만 제가 말했듯이 ForEach 내부에 스레드를 생성하는 것은 좋은 생각이 아닙니다. 비동기 동작도 아닙니다. 게시 한 링크는 유용한 정보와 솔루션을 제공합니다. –

11

Parallel.Foreach에서는 필요하지 않습니다. foreach는 사용 가능한 프로세서 수만큼의 스레드에서만 실행되지만 동 기적으로 반환됩니다. , Parallel.ForEach (groupedUnreadMessages :

자세한 내용은 here

+9

사용하는 (최대) 스레드 수가 너무 간단하지 않습니다. –

관련 문제