BackgroundWorker에 대한 작업 병렬 라이브러리 대체?


83

태스크 병렬 라이브러리에 BackgroundWorker 클래스를 대체하거나 개선 한 것으로 간주되는 것이 있습니까?

마법사 스타일의 UI가있는 WinForms 응용 프로그램이 있으며 몇 가지 장기 실행 작업을 수행합니다. 표준 진행률 표시 줄과 작업 취소 기능을 사용하여 반응 형 UI를 사용하고 싶습니다. 이전에 BackgroundWorker로이 작업을 수행했지만 대신 사용할 수있는 TPL 패턴이 있는지 궁금합니다.


답변:


91

Task클래스는에 비해 개선 BackgroundWorker; 자연스럽게 중첩 (상위 / 하위 작업)을 지원하고 새로운 취소 API, 작업 연속 등을 사용합니다.

제 블로그 에 예전 BackgroundWorker방식과 새로운 Task방식을 보여주는 예가 있습니다. 진행 상황을보고해야하는 작업을위한 작은 도우미 클래스가 있습니다. 구문이 다소 어색하기 때문입니다. 이 예에서는 결과 값, 오류 조건, 취소 및 진행보고를 다룹니다.


기술적으로 정답이기 때문에 이것과 Hatch의 대답 사이에서 결정하기가 어렵습니다. 그러나 귀하의 블로그는 새로운 Task 클래스를 사용하는 방법을 보여줍니다. 이것이 제가 찾고 있던 것이 바로 BackgroundWorker에서 진화 한 것입니다. 내 응용 프로그램에서 코드의 기초로 귀하의 예제를 사용하고 있습니다.
Keith G

2
며칠 전에 나는 다양한 백그라운드 처리 기술에 대한 비교를 작성했습니다 . BackgroundWorker진행률보고가 더 쉬우 며 Task중첩 을 허용합니다. 두 가지 중에서 선호합니다 Task( 중첩을 허용하는 것보다 진행률보고를 정리하는 것이 훨씬 쉽습니다). 하지만 둘 다 다른 일반적인 솔루션보다 광년 앞서 있습니다. 내가 사용하는 사람들의들을 때 나는 싫증이 나다 ThreadThreadPool.QueueUserWorkItem. 백그라운드 작업에 올바르게 사용하기 가장 어렵습니다.
Stephen Cleary

더 쉬운 진행보고? 백분율을보고하려는 경우에만. 다른 것을보고하려면 begininvoke 또는 SynchronizationContext.Post ugliness
Panagiotis Kanavos

5
@PanagiotisKanavos : 임의의 개체를 userState. 그러나 마지막 댓글 이후 2.5 년 동안 의 진행 상황 보다 더 깨끗하고 쉬운 및 Task로 보완되었습니다 . 현대 코드에서는 더 이상 사용할 이유가 없습니다 . IProgress<T>Progress<T>BackgroundWorkerBackgroundWorker
Stephen Cleary 2013

네, 방금 알아 챘어요. 어떻게 든 TPL 태그를 클릭하여 새로운 질문을 찾을 때이 게시물이 맨 위에 올랐습니다!
Panagiotis Kanavos 2013

23

백그라운드 작업자는 여전히이를 달성하는 유효한 방법입니다. 여러 대규모 작업을 동시에 실행하는 경우 병렬 확장을 고려할 가치가있을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.