2010-02-11 5 views
1

저는 BackgroundWorker에 의해 비동기로 작업되는 메서드가 있습니다. 이 메서드 내에서 일부 코드는 1000 밀리 초 간격으로 무한 루프됩니다.C# BackgroundWorker 질문

이 코드 내에서 일부 값에 따라 이벤트가 전달됩니다. 지금까지 내가 이해 한대로이 이벤트는 발생 된 코드와 동일한 스레드에서 실행됩니다.

하지만이 이벤트는 BackgroundWorker를 보유하고있는 개체와 동일한 스레드에서 실행됩니다. 어떻게해야합니까?

+1

@Thomas : 스레드 풀/백그라운드 작업자를 사용하는 대신 장기간 실행 (또는 무한 경우) 프로세스 용으로 별도의 스레드를 시작하는 것이 가장 좋습니다. Adam이 제안했듯이 Timer가 더 적합 할 수 있습니다. –

+0

개체 스레드가 계속 작동하게하려면 실제로는 불가능합니다. 할 수있는 일은 AutoResetEvent 또는 ManualResetEvent를 사용하여 주 스레드가 다시 작업을 시작하도록하거나 지속적으로 휘발성 bool을 검사하여 백그라운드 작업자가 작업을 완료했는지 확인하는 것입니다. – Will

답변

4

Timer을 사용하면 되풀이 일정을 예약하는 것이 더 낫습니다. 이것이 Windows Forms 응용 프로그램 인 경우 ("소유"스레드의 컨텍스트에서 실행하려는 것이므로 가정합니다) System.Windows.Forms.Timer 인스턴스를 사용해야합니다.

+1

+1 타이머는 간단하고 사용하기 쉽습니다. –

+0

타이머는 소유 스레드와 동일한 컨텍스트에서 경과 이벤트를 실행하지 않습니까? 경과 이벤트는 별도의 스레드에서 실행됩니다. – Will

+1

@Will : 'System.Threading.Timer'는 사용자가 설명하는대로 동작합니다. 'System.Windows.Forms.Timer' 이벤트는 UI 스레드에서 실행됩니다. –

2

도메인 및 응용 프로그램에 따라 원하는 스레드에서 실행되는 ProgressChanged 이벤트 (및 ReportProgress 메서드)를 사용할 수 있습니다.

0

'받기'스레드가 GUI 스레드입니까? 그렇다면 Control.Invoke() 또는 Control.BeginInvoke()를보십시오. 그것이 당신의 폼 또는 폼의 일부 컨트롤이라고 가정하면,이주기적인 이벤트를 처리하는 것이고, 그렇게 할 수 있어야합니다.

+0

예 .. 아니오 ^^ Invoke가 완벽 할 것이지만 스레드는 GUI 스레드가 아닙니다. 모두 .. 너무 ISynchronizeInvoke를 구현하려했지만 더 쉬운 방법이있을 거라 생각했기 때문에 너무 복잡했습니다 .. 지금 타이머를 사용하고 매력처럼 작동합니다.) – Thomas

+0

그래, GUI 스레드에서만 작동합니다. 이미 메시지 루프가 있기 때문에 다른 스레드에서 자신 만의 메시지 루프를 만들어야합니다. 간단하지 않을거야! – Andy

0

이벤트를 BackgroundWorker Holder에 다시 게시하는 데 사용할 수있는 System.Threading.SynchronizationContext을 살펴 봐야 할 수 있습니다.