如何监控重要的工作者线程

时间:2010-03-04 15:21:35

标签: c# multithreading

我有一个对我的申请至关重要的工作线程 它是用new Thread( method ).Start();创建的,我不加入它,我只是希望只要我的程序运行就会运行 但是,可能会发生此线程上发生异常;并且作为一个结果,线程将(除了一些最后的日志记录)关闭。此严重错误无法恢复。由于线程对于应用程序至关重要,因此它也必须关闭。

现在我的问题是:如何监控我的线程状态?

你会

吗?
  • 轮询IsAlive属性?
  • 重新抛出已捕获的例外并使用AppDomain.CurrentDomain.UnhandledException
  • 实现一个event来表示我的后台线程的结束?
  • 使用实现BackgroundWorker的{​​{1}}? (但对于长时间运行的线程,BackgroundWorker真的是正确的选择吗?)
  • 完全不同的东西?

修改
现在,我通过致电RunWorkerCompleted - >解决了这个问题。 早期崩溃,经常。这也是一个选择:)

2 个答案:

答案 0 :(得分:2)

为什么不像这样包装你的主线程程序:

 void ThreadStart()
 {
       try 
       {
            ThreadImplementation();           
       }
       catch (Exception e)
       { 
            mainForm.BeginInvoke(OnBackgroundThreadException, e);
       }
 }

这将确保每当线程异常关闭时,在应用程序的主线程上都会收到消息。您不需要轮询任何内容。当您需要异步地回访UI线程时,BackgroundWorker通常很有用。 (I.E.进展更新)。

答案 1 :(得分:2)

在线程的异常处理程序结束时,在主线程上调用一个回调方法并重新启动worker:

public delegate void AbnormalExitDelegate(object errorArgs);

class Boss
{
    Worker worker;
    void Start()
    {
        worker = new Worker();
        worker.AbnormalExitCallback = new AbnormalExitDelegate(AbnormalExit);
        Thread workerThread = new Thread(worker.DoWork);
        workerThread.Start();
    }
    public void AbnormalExit(object errorArgs)
    {
        Start();
    }
}
class Worker
{
    public AbnormalExitDelegate AbnormalExitCallback;
    public void DoWork()
    {
        try
        {
           // do work here
        }
        catch (Exception ex)
        {
            // pass stuff back, like the exception
            AbnormalExitCallback(ex);
        }
    }
}