C# 对BackgroundWorker事件不触发感到困惑
这似乎是一个有点做作的例子,但让我挠头 好的,我有一个控制台应用程序,它实例化一个WindowsForm,并在窗体上调用一个名为DoSomeWork()的方法C# 对BackgroundWorker事件不触发感到困惑,c#,.net,winforms,backgroundworker,C#,.net,Winforms,Backgroundworker,这似乎是一个有点做作的例子,但让我挠头 好的,我有一个控制台应用程序,它实例化一个WindowsForm,并在窗体上调用一个名为DoSomeWork()的方法 class Program { static void Main(string[] args) { Form1 form = new Form1(); form.DoSomeWork(); } } 表格1看起来像这样 public partial clas
class Program
{
static void Main(string[] args)
{
Form1 form = new Form1();
form.DoSomeWork();
}
}
表格1看起来像这样
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();
}
}
外部类,反过来,看起来像这样
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();
}
}
最后,内部类看起来像这样
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();
}
}
由于(我)不知道的原因,InnerClass中的BacgroundWorker似乎从未触发ProgressChanged事件。如果我替换
Form1 form = new Form1();
与
在课堂教学中,效果很好。那么,当我通过表单调用相同的方法时,为什么我的事件不会触发呢
谢谢
编辑:我将ProgressChanged事件处理程序保留为抛出NotImplementedException,这似乎是在吓人,因此为了清楚起见,我将其删除。您是否真的
抛出NotImplementedException()代码>在处理程序中?或者你只是很快地模拟了一下,却忘了把它移除
我的猜测是,这与正在使用的不同线程单元模型有关
根据我的经验,如果一个单线程单元非UI线程在主UI线程之外抛出一个异常,该线程将在没有任何警告的情况下死亡
如果我没记错的话,Windows窗体需要与控制台应用程序不同的单元模型。这可能是问题的根源
我可能错了,但这应该会给出一些提示。您忘记启动消息循环,需要调用Application.Run()。如果没有消息循环,BackgroundWorker事件将无法工作。要修复:
static void Main(string[] args)
{
Application.Run(new Form1());
}
在窗体的构造函数或其加载事件中调用DoSomeWork()。是的,我在模拟应用程序,这就是为什么我在其中保留NotImplementedException。在任何情况下,它都不会被抛出,因为ProgressChanged事件从不激发。但你至少给了我一些可以一起工作的东西…谢谢!啊,但是你怎么知道ProgressChanged事件从不触发呢?他的观点是NotImplementedException可能会被抛出,但会被忽略。添加调试。打印在那里,看看你是否看到了。哦,我现在明白了…我添加了调试代码,但仍然没有骰子。我需要阅读有关在Windows窗体应用程序中使用后台线程的内容,最后:)谢谢。这就是问题所在。非常感谢!