这可能看起来像是一个有点人为的例子,但我只是在摸不着头脑。
好的,我有一个控制台应用程序来实例化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();
}
}
由于一个未知的原因(对我而言),InnerClass中的BacgroundWorker似乎从未触发 ProgressChanged 事件。如果我更换
Form1 form = new Form1();
带
OuterClass outerClass = new OuterClass()
在课程计划中,它运作正常。那么,当我通过表单调用相同的方法时,为什么我的事件不会触发?
谢谢!
编辑:我似乎是通过将ProgressChanged事件处理程序保留为抛出NotImplementedException来抛弃人员,所以为了清楚起见我删除了它。答案 0 :(得分:6)
您忘记启动消息循环,需要调用Application.Run()。如果没有消息循环,BackgroundWorker事件将无法工作。修复:
static void Main(string[] args)
{
Application.Run(new Form1());
}
在表单的构造函数中调用DoSomeWork()或它是Load事件。
答案 1 :(得分:2)
你真的在处理程序中throw NotImplementedException();
了吗?或者你只是快速嘲笑它并忘记删除它?
我的猜测是它与正在使用的不同线程公寓模型有关。
根据我的经验,如果单线程公寓非UI 线程在主UI线程之外引发异常,那么该线程将在没有任何警告的情况下死亡。
如果我没记错的话,Windows窗体需要与控制台应用程序不同的公寓模型。这可能是问题的根源。
我可能错了,但应该给出一些指示。