문제

이것은 다소 고안된 예처럼 보일지 모르지만 머리를 긁고 남았습니다.

좋아, 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();
    }
  }

그리고 마지막으로 내부 등급은 다음과 같습니다 ...

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();
    }
  }

알 수없는 이유로 (나에게), 내부의 bacgroundworker는 결코 해고하지 않는 것 같습니다. 진행중인 이벤트. 내가 교체하면

Form1 form = new Form1();

~와 함께

OuterClass outerClass = new OuterClass()

수업 프로그램에서는 잘 작동합니다. 양식을 통해 동일한 방법을 호출 할 때 왜 내 이벤트가 발사되지 않습니까?

감사!

편집 : 나는 진보적 인 이벤트 핸들러를 명확한 표현을 던지는 것으로 남겨 두어 사람들을 버리고있는 것 같았으므로 명확성을 위해 그것을 제거했습니다.

도움이 되었습니까?

해결책

메시지 루프를 시작하는 것을 잊어 버렸습니다. Application.Run ()이 필요합니다. 메시지 루프가 없으면 배경 작업자 이벤트는 작동 할 수 없습니다. 고치다:

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

양식 생성자 또는로드 이벤트에서 Dosomework ()를 호출하십시오.

다른 팁

당신은 실제로 throw NotImplementedException(); 핸들러에서? 아니면 이걸 빨리 조롱하고 제거하는 것을 잊었습니까?

내 생각에 다른 스레드 아파트 모델이 사용되는 것과 관련이있을 것입니다.

단일 스레드 아파트 인 경우 내 경험에서 비 UI 스레드는 기본 UI 스레드 외부에서 예외를 던지고 그 스레드는 단순히 경고없이 죽습니다.

Windows 양식에는 올바르게 기억한다면 콘솔 애플리케이션과 다른 아파트 모델이 필요합니다. 그것이 문제의 원천 일 수 있습니다.

나는 틀릴 수 있지만 그것은 약간의 포인터를 주어야한다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top