我有以下代码:
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中工作时可能发生了跨线程异常。我尝试显式更新UI,而不检查是否InvokeRequired,并且线程继续运行,而发行版本中没有问题。怎么会这样? (应该发生跨线程异常)如何确定导致线程死亡的原因?关于如何找出问题所在或如何调试此问题的任何建议将不胜感激?
最佳答案
UI线程上可能不会触发RunWorkerCompleted事件。如果不是,则线程将结束,您的调度程序对象将被垃圾回收,这将使其看起来像是退出而没有错误。有关更多详细信息,请参见this帖子。 Here和here是关于此的SO帖子。
关于c# - BackgroundWorker意外死亡,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1682744/