2008-10-23 5 views
2

다소 고의적 인 것처럼 보일지 모르지만, 저는 머리를 긁적 거리고 있습니다.BackgroundWorker 이벤트가 실행되지 않는다고 혼동했습니다.

좋아요, 저는 WindowsForm을 인스턴스화하고 양식에 DoSomeWork()라는 메서드를 호출하는 콘솔 응용 프로그램이 있습니다.

class Program 
    { 
    static void Main(string[] args) 
    { 
     Form1 form = new Form1();   
     form.DoSomeWork(); 
    } 
    } 

Form1이 ...이 같은

public partial class Form1 : Form 
    { 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public void DoSomeWork() 
    { 
     OuterClass outerClass = new OuterClass(); 
     outerClass.DoSomeWork(); 
    }  
    } 

외부 클래스는, 차례로, 다음과 같습니다 ...

public class OuterClass 
    { 
    public void DoSomeWork() 
    { 
     InnerClass innerClass = new InnerClass(); 
     innerClass.DoSomeWork(); 
    } 
    } 

보이는 그리고 마지막으로 InnerClass는 ...

다음과 같습니다
public class InnerClass 
    { 
    private BackgroundWorker _backgroundWorker = new BackgroundWorker(); 

    public InnerClass() 
    { 
     _backgroundWorker.WorkerReportsProgress = true; 
     _backgroundWorker.DoWork += new DoWorkEventHandler(BackgroundWorker_DoWork); 
     _backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(BackgroundWorker_ProgressChanged); 
    } 

    void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     int i = 0; //I've placed a break point here. But it's never hit 
    } 

    void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 

     worker.ReportProgress(42); 
    } 

    public void DoSomeWork() 
    { 
     _backgroundWorker.RunWorkerAsync(); 
    } 
    } 

알 수없는 이유로 (나에게) B InnerClass의 acgroundWorker가 ProgressChanged 이벤트를 발생시키지 않습니다. 나는 수업 프로그램에

OuterClass outerClass = new OuterClass() 

Form1 form = new Form1(); 

를 교체하는 경우, 그것을 잘 작동합니다. 그런데 왜 양식을 통해 동일한 방법을 호출 할 때 내 이벤트가 실행되지 않습니까?

감사합니다.

EDIT : ProgressChanged 이벤트 처리기를 NotImplementedException을 던진 상태로 두어 사람을 던지고있는 것처럼 보였으므로 명확히하기 위해 제거했습니다.

답변

6

메시지 루프를 시작하는 것을 잊었 으면 Application.Run() 호출이 필요합니다. 메시지 루프가 없으면 BackgroundWorker 이벤트가 작동하지 않습니다. 수정하려면 :

static void Main(string[] args) 
{ 
    Application.Run(new Form1()); 
} 

DoSomeWork()를 폼의 생성자 또는 Load 이벤트를 호출하십시오.

+0

예, 마침내 :) 감사합니다. 그것이 문제였습니다. 매우 감사! – Senkwe

2

처리기에서 실제로 throw NotImplementedException();이 (가)나요? 아니면 이걸 빨리 조롱하고 제거한다는 걸 잊었 니?

내 생각 엔 다른 스레드 아파트 모델과 관련되어 있다는 것입니다.

단일 스레드 아파트 비 UI 스레드가 기본 UI 스레드 외부에서 예외를 발생시키는 경우, 해당 스레드는 경고없이 간단히 종료됩니다.

Windows Forms에서는 올바르게 기억하면 콘솔 응용 프로그램과 다른 아파트 모델이 필요합니다. 이것이 문제의 근원이 될 수 있습니다.

내가 틀릴 수도 있지만 몇 가지 지침을 제공해야합니다.

+0

예, 거기에 NotImplementedException을 남긴 이유는 앱을 조롱했습니다. ProgressChanged 이벤트가 발생하지 않으므로 어쨌든 결코 throw되지 않습니다. 하지만 적어도 저와 일할 무언가를 주셨습니다 ... 고마워요! – Senkwe

+0

아, ProgressChanged 이벤트가 발생하지 않는다는 것을 어떻게 알 수 있습니까? 그의 요점은 NotImplementedException이 던져 질 수도 있지만 무시된다는 것입니다. Debug.Print를 거기에 추가하고 볼 수 있는지 확인하십시오. –

+0

아, 지금은 이해 ... 잘 디버그 코드를 추가하고 여전히, 아니 주사위.Windows Forms 응용 프로그램 내에서 백그라운드 스레드를 사용하여 읽어야합니다. – Senkwe

관련 문제