.NET 4에서 Winforms 응용 프로그램을 상속했습니다 (변경할 수 없음). 응용 프로그램은 TPL을 사용하여 여러 작업을 병렬로 실행합니다. 첫째, 작업이 생성되고 복잡한 작업을 수행하는 작업이 더 많이 생성됩니다. 주 작업이 WaitAll(tasks)
과 함께 대기 중입니다.진행 보고서로 여러 작업 실행
이 작은 계산 작업은 진행률 표시 줄을 업데이트하기 위해 응용 프로그램에서 호출하는 각 진행 보고서의 주 양식으로 진행 상황을보고하지만 모든 작업이 완료된 후에 만 업데이트되는 것이 문제입니다. 문제는 기본 스레드가 UI 스레드에서 실행되고 WaitAll()
을 호출하여 해당 스레드를 차단하므로 BeginInvoke()
호출이 이벤트 루프에 쌓여 있다는 것입니다.
이 경우 정확한 접근 방법은 무엇입니까?
다른 답변을 읽으면 ThreadPool 스레드에서 실행되는 작업을 강제로 수행 할 수 없으므로 기본 작업을 BackgroundWorker로 대체하려고합니다. 초기 작업에 옵션 TaskCreationOptions.LongRunning 설정
는
당신이 WaitAll을해야하는 이유 올바른 접근 방식은 이유에 따라()에서 실행하게됩니다. 그러나 대부분의 경우 백그라운드 스레드를 사용하여 모든 작업이 끝나기를 기다리는 것이 좋을 것이라고 생각합니다. – elgonzo
기본 작업이 완료되면 (ContinueWith() 호출이있을 때) 더 많은 작업을 수행해야하므로 WaitAll이 필요합니다. – Buzzy
그런 다음 백그라운드 작업자 스레드를 사용하십시오. 이를 수행하는 한 가지 방법은 예를 들어 Kev의 대답에 의해 제안 된 것과 같습니다. (이 동작은 TaskCreationOptions.LongRunning이 Microsoft에서 .NET 4.x 용으로 확인되었지만 향후 .NET 버전에 대한 동작은 보장되지 않지만 '확인 된 구현 세부 사항'이므로 변경 될 가능성은 다소 낮습니다. ';-)) – elgonzo