我有以下代码:

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帖子。 Herehere是关于此的SO帖子。

关于c# - BackgroundWorker意外死亡,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1682744/

10-09 01:09