c# - BackgroundWorker 意外死亡

标签 c# backgroundworker

我有以下代码:

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发布更多详细信息。 Herehere有关于此的 SO 帖子。

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

相关文章:

c# - 使用 Windsor 注册特定程序集和命名空间中的所有服务?

f# - 编写轮询 Windows 服务

c# - 如何处理在 BackgroundWorker 中运行的方法的状态

c# - 检查另一个表单中的线程是否仍在运行

wpf - 从 WinForms BackgroundWorker 创建 WPF 窗口

c# - 多线程时 i 的错误值?

c# - 从 UI 层抽象 asp.net mvc 标识

使用 Microsoft.Deployment.Compression.Zip 的 c# zip 文件

c# - 替换字符串正则表达式中的日期

C# 委托(delegate)和函数调用