Потоки: обратный вызов основного потока в .NET Windows Service с использованием C # - PullRequest
1 голос
/ 20 января 2011

Я унаследовал многопоточную службу 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 для использования?Стоит ли вместо этого использовать Async Delegates или Task Parallel Library?

Ответы [ 2 ]

2 голосов
/ 20 января 2011

У меня недавно было похожее требование.Я не думаю, что вы можете положиться на дочерние потоки, сообщающие родителям, когда они плохие.Что если они застряли в бесконечном цикле или по какой-то причине оказались в тупике?Я остановился на подходе «сторожевой пес».Каждый дочерний поток должен был отправить «сердцебиение» обратно в основной поток.Если этот сигнал не был получен, то поток считается «мертвым», и может быть предпринято действие.Вот пост об архитектуре, на которой я остановился:

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

Надеюсь, это поможет.

Боб

0 голосов
/ 20 января 2011

Даниэль Мот много писал в блоге о многопоточности и совсем недавно о поддержке параллельных задач в .net 4.0. Это отличный ресурс, http://www.danielmoth.com и очень интересный. Я определенно проверю это.

Я не уверен, помогает ли это, но я работал над службой Windows «Средство выполнения отчетов», которая берет задания из очереди и затем планирует работу в ThreadPool; это работало хорошо, потому что, если «Отчет» не удался, я просто регистрирую ошибку и завершаю функцию, и, поскольку она была запланирована в ThreadPool, она просто возвращается в пул для запуска большего количества отчетов. Использование ThreadPool позволяет избежать кода, необходимого для управления раскруткой нового потока в случае сбоя выполняемого кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...