2011-09-15 2 views
6

나는 한 번에 하나씩 만 실행하는 많은 방법이 있지만 모두 동일한 RunWorkerCompleatedProgressChanged 메서드를 사용하지만 모두 서로 다른 Dowork 메서드를 사용합니다. 다음을 수행하는 것이 안전합니까?RunWorkerAsync를 호출 한 후 함수가 종료되기 전에 DoWork를 안전하게 해지 할 수 있습니까?

private void button_Process_Click(object sender, EventArgs e) 
{ 
    bgWork_Process.DoWork += Scrub_DoWork; 
    bgWork_Process.RunWorkerAsync(); 
    bgWork_Process.DoWork -= Scrub_DoWork; 
} 

또는 이렇게 할 수 있습니까? 나는 MSDN에서 아무 것도 보지 못했고 허용되지 않았으며 (지금까지는) 내 프로그램에서 잘 돌아가는 것으로 보았으나,이 문제를 해결하는 데 어려움을 겪고 있는지 확인하기 위해 여기를 확인하고 싶었습니다.

+0

예 저장됩니다. 다른 메소드는 스레드입니다. –

답변

1

Action DoWorkAction; 

private void button_Process_Click(object sender, EventArgs e) 
{ 
    gbHistory.Enabled = false; 
    gbScrub.Enabled = false; 
    DoWorkAction = new Action(Scrub_DoWork); 
    bgWork_Process.DoWork += DoWorkAction; 
    bgWork_Process.RunWorkerAsync(); 
} 

에 그리고 어떤 비슷한 일을하는 것입니다 당신이 작업이 완료 될 때까지 이벤트 핸들러가 제거되지 않는 것을 확인하기 위해 무엇을 할 수 있는지 당신의 완료 처리

private void bgWork_Process_CompletedHandler(object sender, EventArgs e) 
{ 
    bgWork_Process.DoWork -= DoWorkAction; 
} 

그러나 나는 생각합니다. 비슷한 작업을 공유하거나 수업을 마무리하는 대신 수행해야하는 모든 작업에 대해 개별적으로 BackGroundWorkers을 분리하는 것이 더 좋을 수 있으므로 수행중인 작업에 대해 더 분명하게 알 수 있습니다.

+0

나는 당신이 제안한 것과 같은 배경 노동자들을 사용하여 끝낼 것이라고 생각하지만, 나는 나의 OP에서하고있는 것이 안전 할지라도 여전히 확실한 예 또는 아니오를 알고 싶다. –

+0

@ScottChamberlain 나는 이벤트 패턴이 작동하는 방식으로 안전하다고 확신한다. 이벤트는 이미 DoWork Delegate에 대한 위임자가있는 백그라운드 작업자를 시작한 RunWorkerAsync에 대해 해고 된 다음 모든 작업이 완료되면 제거한다. 촬영 장소. – msarchet

+0

감사합니다.하지만 언제 어디서'BackgroundWorker'에서'RunWorkerCompleted'를 등록 해제해야합니까? – Agent007

관련 문제