2013-11-15 4 views
1

.NET 4에서 Winforms 응용 프로그램을 상속했습니다 (변경할 수 없음). 응용 프로그램은 TPL을 사용하여 여러 작업을 병렬로 실행합니다. 첫째, 작업이 생성되고 복잡한 작업을 수행하는 작업이 더 많이 생성됩니다. 주 작업이 WaitAll(tasks)과 함께 대기 중입니다.진행 보고서로 여러 작업 실행

이 작은 계산 작업은 진행률 표시 줄을 업데이트하기 위해 응용 프로그램에서 호출하는 각 진행 보고서의 주 양식으로 진행 상황을보고하지만 모든 작업이 완료된 후에 만 ​​업데이트되는 것이 문제입니다. 문제는 기본 스레드가 UI 스레드에서 실행되고 WaitAll()을 호출하여 해당 스레드를 차단하므로 BeginInvoke() 호출이 이벤트 루프에 쌓여 있다는 것입니다.

이 경우 정확한 접근 방법은 무엇입니까?

다른 답변을 읽으면 ThreadPool 스레드에서 실행되는 작업을 강제로 수행 할 수 없으므로 기본 작업을 BackgroundWorker로 대체하려고합니다. 초기 작업에 옵션 TaskCreationOptions.LongRunning 설정

+0

당신이 WaitAll을해야하는 이유 올바른 접근 방식은 이유에 따라()에서 실행하게됩니다. 그러나 대부분의 경우 백그라운드 스레드를 사용하여 모든 작업이 끝나기를 기다리는 것이 좋을 것이라고 생각합니다. – elgonzo

+0

기본 작업이 완료되면 (ContinueWith() 호출이있을 때) 더 많은 작업을 수행해야하므로 WaitAll이 필요합니다. – Buzzy

+0

그런 다음 백그라운드 작업자 스레드를 사용하십시오. 이를 수행하는 한 가지 방법은 예를 들어 Kev의 대답에 의해 제안 된 것과 같습니다. (이 동작은 TaskCreationOptions.LongRunning이 Microsoft에서 .NET 4.x 용으로 확인되었지만 향후 .NET 버전에 대한 동작은 보장되지 않지만 '확인 된 구현 세부 사항'이므로 변경 될 가능성은 다소 낮습니다. ';-)) – elgonzo

답변

2

는 별도의 스레드 (안 스레드 풀 스레드)

+0

사실 나는 그것을 시도하고 그것은 작동하지 않았다. 작업은 여전히 ​​주 스레드에서 실행됩니다. – Buzzy

+0

내가 시도한만큼 실제로 내 컴퓨터에서 만든 샘플 앱의 UI 스레드와 동일한 스레드에서 실행되는 작업을 얻을 수 없습니다. Rich Newman은 자신이 찾고있는 사이트 일 수있는 샘플을 가지고 있습니다. http://richnewman.wordpress.com/2012/11/21/why-starting-a-new-task-in-the-task-parallel-library-tpl-doesnt-always-start-a-new-thread/ – Kev

+0

제 경우에는 항상 UI 스레드에서 실행됩니다. 나는 옵션과 스케줄러를 변경하는 것을 지치지 만 UI 스레드에서 작동하지 않습니다. – Buzzy