BackgroundWorker不会触发RunWorkerCompleted事件
本文关键字:RunWorkerCompleted 事件 BackgroundWorker | 更新日期: 2023-09-27 18:02:34
我正在创建backgroundworker不是在我的windows形式,而是在实现所有处理的类文件(BusinessLogic)。在主表单中,我首先调用初始化BGW的BL方法。然后我调用BL的方法,启动BGW。
这里有更多的背景:)关于我的实现。如何在类文件中使用BackGroundWorker ?
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;
}
已完成的事件被主线程调用。它应该被MessagePump拾取并执行。
但是,Wait-and-Sleep代码阻塞了消息循环。 Hide();
....
while (!BusinessLogic.firstCycleDone)
{
Thread.Sleep(100);
}
Show();
这里的答案是,你没有使用后台工作者或其他形式的线程…
直接调用bgWorker_DoWork()
:
// Hide();
bgWorker_DoWork(); // rename
Show();
如果你只是调用Application.DoEvents();
而不是Sleep(100);
你的代码将工作,但正如我之前说的BackgroundWorker
类是一个有bug的东西,我会亲自使用我自己的线程和报告
或者你可以睡一会儿,然后调用DoEvents