我正在创建不在我的Windows窗体中的后台工作程序,而是在实现所有处理的类文件(BusinessLogic)中。从主窗体我首先调用初始化BGW的BL方法。然后我调用BL的方法来启动BGW。
这是我的实现的更多背景:)。 How to use BackGroundWorker in class file?
DoWork事件运行正常,但它不会调用RunWorkerCompleted。
一些谷歌搜索,我发现了这个链接。我觉得我的问题与这些家伙一样。 http://www.eggheadcafe.com/software/aspnet/29191764/backgroundworker-does-not-fire-the-runworkercompleted-event.aspx
我对此问题的任何意见表示感谢。提前谢谢。
主要形式的代码:
private void frmMain_Load(object sender, EventArgs e)
{
Hide();
BusinessLogic.BGWInitialize();
BusinessLogic.StartBackgroundWorker();
while (!BusinessLogic.firstCycleDone)
{
Thread.Sleep(100);
}
Show();
}
BusinessLogic中的代码:
public static void BGWInitialize()
{
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgressChanged);
bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
bgWorker.WorkerReportsProgress = true;
}
public static void StartBackgroundWorker()
{
bgWorker.RunWorkerAsync();
}
private static void bgWorker_RunWorkerCompleted(
object sender, RunWorkerCompletedEventArgs e)
{
firstCycleDone = true;
}
答案 0 :(得分:6)
已完成的事件被调用到主线程。它应该被MessagePump拾取并执行。
但是,您的等待和睡眠代码阻止了消息循环。
Hide();
....
while (!BusinessLogic.firstCycleDone)
{
Thread.Sleep(100);
}
Show();
这里的答案是你没有使用Backgroundworker或其他形式的线程......
直接致电bgWorker_DoWork()
:
// Hide();
bgWorker_DoWork(); // rename
Show();
答案 1 :(得分:-1)
如果您只是致电Application.DoEvents();
而不是Sleep(100);
,那么您的代码就可以正常运行,但正如我之前所说BackgroundWorker
类是一个有缺陷的东西,我会亲自使用自己的线程和报告
或者你可以睡一会儿,然后拨打DoEvents