배경 작업자 이벤트가 발사되지 않는 것에 대해 혼란스러워합니다
-
04-07-2019 - |
문제
이것은 다소 고안된 예처럼 보일지 모르지만 머리를 긁고 남았습니다.
좋아, 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 양식에는 올바르게 기억한다면 콘솔 애플리케이션과 다른 아파트 모델이 필요합니다. 그것이 문제의 원천 일 수 있습니다.
나는 틀릴 수 있지만 그것은 약간의 포인터를 주어야한다.