我有以下代码:
public Mainform()
{
...
// scheduler
scheduler.DoWork += new System.ComponentModel.DoWorkEventHandler(scheduler_DoWork);
scheduler.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(scheduler_RunWorkerCompleted);
scheduler.WorkerReportsProgress = false;
scheduler.WorkerSupportsCancellation = true;
...
...
scheduler_DoWork(this, null);
scheduler.RunWorkerAsync(1000);
...
}
void scheduler_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
scheduler_Enabled = false;
CustomExceptionHandler eh = new CustomExceptionHandler();
eh.HandleUnhandledException(e.Error, "scheduler");
}
if(scheduler_Enabled)
{
scheduler.RunWorkerAsync(1000);
}
}
void scheduler_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
try
{
try
{
...do some stuff
}
catch(MyException ex)
{
ThreadSafeShowError();
}
finally
{}
...do more stuff
}
finally
{
if (e != null && e.Argument != null)
{
Thread.Sleep((int)e.Argument);
}
}
}
后台工作线程意外终止,没有抛出任何异常。我在开发的时候没有遇到这个问题,好像很难重现。我怀疑我在scheduler_DoWork工作时可能发生了跨线程异常。我试图在不检查 InvokeRequired 的情况下显式更新 UI,并且线程在发布版本中继续运行而没有问题。怎么会这样? (应该会出现跨线程异常)如何判断线程死掉的原因?任何有关如何找出问题所在或如何调试此问题的建议都将不胜感激?
最佳答案
可能不会在 UI 线程上触发 RunWorkerCompleted 事件。如果不是,则线程将结束并且您的调度程序对象将被垃圾收集,这将使它看起来像是刚刚退出而没有错误。参见 this发布更多详细信息。 Here和 here有关于此的 SO 帖子。
关于c# - BackgroundWorker 意外死亡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1682744/