2011-01-21 2 views
9

BackgroundWorkerThread의 차이점은 무엇입니까? 내 응용 프로그램에서는 데이터베이스와 정기적으로 통신하는 메시징 시스템을 사용하고 있습니다. 어느 것을 여기에서 사용하고 싶습니까? BackgroundWorker 또는 Thread?BackgroundWorker와 Thread의 차이점은 무엇입니까?

답변

19

BackgroundWorker은 WinForms에서 사용할 준비가 된 클래스이므로 UI가 멈추는 것을 피하는 백그라운드 스레드에서 작업을 실행할 수 있으며이 기능 외에도 주 스레드에서 성공 콜백의 실행을 쉽게 마샬링 할 수 있습니다. 결과로 사용자 인터페이스를 업데이트 할 수있는 가능성. 또한 진행 상황을 추적하고 작업을 취소 할 수있는 가능성을 제공합니다. 스레드 풀의 스레드를 사용합니다.

한편 Thread은 새로운 thread에서 일부 작업을 간단하게 실행할 수있는 클래스입니다. 그것은 훨씬 더 기본적인 개념입니다.

1

BackgroundWorker는 이미 진행률, 완료 및 취소보고 기능을 구현 했으므로 직접 구현할 필요가 없습니다. 스레드 사용은 비동기 프로세스 실행 (예 : 스레드 우선 순위 또는 전경/백그라운드 스레드 유형 선택)에 대한 제어를 강화합니다.

때때로 진행보고 및 기타 BackgroundWorker 작업이 필요하지 않으므로 Thread/ThreadPool이 좋은 대안이 될 수 있습니다.

1

BackgroundWorker는 ThreadPool의 스레드를 사용하며 스레드는 자신의 스레드를 만듭니다. 또한 호출 스레드에보고하는 이벤트 기간에 몇 가지 기능이 있습니다.

+0

ThreadPool을 언급하기 위해 +1 – spender

1

BackgroundWorker는 할당 할 메서드를 할당 할 수있게 해주는 스레드 구현입니다.

작업을 중지하고 진행 상황을 추적하며 비동기 적으로 알림을받을 수있는 통신 API를 제공합니다.

1

BackgroundWorker를 사용하십시오. 어쨌든 스레드를 캡슐화하여 작업하기가 더 쉽습니다. 이 API의 장점 중 하나는 API를 사용하면 간단한 이벤트 기반 모델에서 진행 상황을보고 할 수 있으며 해당 이벤트 호출은 UI 스레드로 올바르게 라우팅되므로 Invoke 메서드를 사용하여 호출을 마샬링 할 필요가 없습니다.

7

BackgroundWorker classThread 클래스에서 파생되지 않지만 스레드를 직접 만들고 작성한 것보다 훨씬 쉽게 작업을 관리 할 수 ​​있습니다. 스레드가 시작될 때 발생 -

  • DoWork가 :

    그것은 세 가지 주요 이벤트를 발생시킵니다.

  • ProgressChanged - 주 UI 스레드로 진행 상황을보고하기 위해 발생합니다.
  • RunWorkerCompleted - 스레드가 완료되면 발생합니다.

RunWorkerAsync()을 호출 한 후 스레드가 수행중인 작업을 모니터링 할 수 있습니다.

+0

BackgroundWorker가 스레드를 캡슐화합니까? 무슨 말을하는거야? 비동기 적으로 호출되는 캡슐화 된 대리자가 있습니다. –

+0

@ lazyberezosky - 네 말이 맞아. 나는 틀린 용어를 사용했다. 나는 대답을 업데이트 할 것이다. – ChrisF

0

큰 차이가 있다고 생각합니다. BackgroundWorker에서 호출하는 메서드에서 UI 구성 요소를 사용하려고하면 전혀 작동하지 않습니다. BackgroundWorker는 실제로 백그라운드 프로세스이므로 인터페이스 작업을 사용할 수 없습니다.예를 들어, 메서드에서 BackgroundWorker가 호출 할 새 레이블을 만들면 오류가 발생합니다.

관련 문제