2009-11-05 2 views
1

BackgroundWorker 또는 Thread를 사용하여 내 비즈니스 계층에있는 클래스에서 내 Windows 양식의 메서드를 호출하려고합니다. 이 비즈니스 계층의 메소드가 완료되기까지 어느 정도 시간이 걸릴 수 있기 때문에 누군가가 듣고 있다면 진행 상황을보고 할 수 있기를 바랍니다. BackgroundWorker로 시작하고 나중에 일반 스레드를 사용하기로 결정 했으므로 어느 쪽에도 묶이지 않기를 바란다.백그라운드 작업 진행자가 다른 클래스에서 변경 되었음

배경 작업자가 호출했는지 알지 못하는 경우 메소드가 진행 상황을보고하는 가장 좋은 방법은 무엇입니까? 비즈니스 계층 클래스에 누군가가 듣고 있다면 진행 상황을 게시 할 수있는 이벤트를 제공 할 생각이었습니다.

프레임 워크에 이미 위임자가 있습니까? InterifyProgressChanged와 같은 것보다 구현할 수있는 인터페이스가 더 낫다.

Public Event foo(ByVal progressVar1 As Double, ByVal progressVar2 As String) 

다음 몇 가지 처리기를 추가 : 난 당신이 이벤트 처리기를 쏜 올바른 방향으로 가고있다 생각

답변

0

, 당신은 클래스에서 이벤트를 선언 할 수와 같은 (사용 VB는, C#을 물론 유사하다) 그것을 당신의 winforms에. 여기서 발생하는 문제는 해고 된 이벤트가 배경 작업자 또는 스레드와 동일한 스레드에서 실행되므로 Invoke() 메서드를 사용하여 실제로 UI가 엉망이되어야한다는 것입니다.

0

당신은 여기에서 구독 할 수있는 몇 가지 이벤트, 또는

bgObj.DoWork += (sender, e)=>{ // do something in your business layer} 
    bgObj.RunWorkerCompleted += (sender, e)=>{ // do something} 
    bgObj.ProgressChanged += (sender, e)=>{ // do something}  

이있는 경우 BackgroundWorker를 활용할 수있는 당신이 당신의 비즈니스 계층에서 공개 이벤트를 (실제 작업을합니까) 선언, 적절한 장소에서 이벤트를 발생시킬 수 있습니다 가입자 (예 : 양식)가 알림을받을 수 있도록합니다.

(UI 스레드와 별도로 UI 컨트롤을 업데이트하지 못할 수도 있습니다. control1.BeginInvoke 메서드를 확인하십시오.)

관련 문제