C # 1.1: мониторинг рабочих потоков - PullRequest
0 голосов
/ 06 февраля 2009

Используя .Net Framework 1.1, какие опции доступны для мониторинга потоков из других потоков? Я пытаюсь разобраться с недостатком реализации потоков в 1.1, в которой необработанные исключения приводят к тому, что потоки молча умирают. В версии 2.0 и позже это было исправлено, так что любое необработанное исключение в любом потоке приведет к смерти всего приложения, я верю.

Когда потоки в моем приложении умирают, я хотел бы извлечь как можно больше контекста из основного потока: метод, который они выполняли, трассировка стека и т. Д. Я могу определить, когда они умирают, но получение контекста оказалось трудным. Я попытался зарегистрировать обработчик для события AppDomain.CurrentDomain.UnhandledException. Но мне не перезванивают, когда происходят события. Вероятно, это связано с ограничением API, для которого я разрабатываю.

Помимо этого события, какие опции доступны для получения контекста из потоков, когда они умирают в другом потоке?

Ответы [ 4 ]

4 голосов
/ 06 февраля 2009

Как вы создаете эти темы? Вы добавляете делегата в пул потоков? Если это так, вы можете создать метод-обертку, который берет предоставленный делегат и оборачивает вокруг него другого делегата, который заботится о вашем try / catch, а затем добавляет этот новый делегат в очередь пула потоков. Таким образом, вы можете вставить свой код обработки ошибок в этот второй делегат.

1 голос
/ 07 февраля 2009

Вы можете попробовать добавить обработчик исключений потока:

System.Threading.ThreadExceptionEventArgs e будет содержать информацию о необработанном исключении.

// Setup Default Thread Exception Handler
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);


static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
    // Insert Code
}

Источник: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx

0 голосов
/ 06 февраля 2009

Я бы создал метод, который будет принимать обратный вызов, который вы обычно передаете потоку, а затем вызывать его внутри некоторого кода-обертки, который вы будете использовать для отслеживания исключений в потоке, что-то вроде этого:

public class ThreadStarter
{
  ThreadStart start;

  public ThreadStarter(ThreadStart start)
  {
    this.start = start
  }

  public void Run()
  {
    // Create the thread.
    Thread t = new Thread(new ThreadStart(InternalRun));
    t.Start();
  }

  private void InternalRun()
  {
    // Wrap in a try/catch.
    try
    {
      // Run the code.
      start();
    }
    catch (Exception e)
    {
      // Process exception here.
    }
  }
}
0 голосов
/ 06 февраля 2009

Как насчет увеличения количества для каждого потока в карте, проиндексированной по идентификатору потока? Когда он прекращает увеличиваться, он мертв, и время убивать и / или перезапускать его. Карта может содержать все, что вам нужно, чтобы управлять всем этим, а также делиться информацией между темой хостинга и этими неприятными маленькими детьми.

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