线程:使用C#回调.NET Windows服务中的主线程

时间:2011-01-19 23:39:06

标签: c# .net multithreading callback windows-services

我继承了多线程Windows服务(C#,.NET),不支持无法处理的异常。该服务使用多个线程从遥测设备收集数据进行分析。此服务中的线程可以运行24小时或更长时间。我正在努力解决如何告诉主线程线程遇到问题并需要回收。这是代码的简化视图:

class Program
{
  static void Main(string[] args)
  {
     var workerObject = new WorkerObject();
     var workerThread = new Thread(workerObject.DoWork);
     workerThread.Start()   
  }
}

class WorkerObject
{
  //todo: My fields and properties go here

  public void DoWork()
  {
    const int timeout = 100;

    //todo: setup wait handles here

    try
    {
      //Start monitoring channels for this device
      while (true)
      {
        // Wait on any waithandle or timeout once per decisecond.
        int channelIndex = WaitHandle.WaitAny(waitHandles, timeout, false);

        //todo: process incoming data for this channel
      }
    }
    //Catch all exceptions so we can notify mommy that we're in a bad way
    catch (Exception ex)
    {
      //todo: log anything that can help us figure this problem out

      //How do I tell the main thread I've failed
    }
    finally
    {
      //But of course we want to clean up after ourselves
    }
  }
}

这是否是最好的.NET线程机制?我应该使用异步代理还是任务并行库?

2 个答案:

答案 0 :(得分:2)

我最近有类似的要求。我不认为你可以依赖子线程告诉父母他们是坏人。如果由于某种原因陷入无限循环或陷入僵局会怎么样?我选择了“看门狗”的方法。每个子线程都需要将“心跳”发送回主线程。如果没有收到这个信号,那么该线程被认为是“死亡”并且可以采取行动。这是一篇关于我定居的建筑的帖子:

http://blog.bobcravens.com/2009/08/monitored-watchdog-asynchronous-process-in-c/

希望这有帮助。

鲍勃

答案 1 :(得分:0)

Daniel Moth在博客上写了很多关于多线程的文章,最近在.net 4.0中支持了Parallel Tasks支持。这是一个很好的资源,http://www.danielmoth.com非常有趣。我肯定会检查出来。

我不确定这是否有帮助,但我在“Report Runner”Windows服务上工作,该服务从队列中获取作业,然后在ThreadPool上安排工作;这很好用,因为如果“报告”失败,我只记录错误并退出该函数,因为它是在ThreadPool中安排的,它只是返回池中运行更多报告。如果您运行的代码失败,使用ThreadPool可以避免管理启动新线程所需的代码。