Ловля исключений в потоке.NET

Как Вы могли узнать что Exception произошедший в a Thread в Приложении MultiThreaded? и последовательно чистый ресурсы?

Поскольку иначе Поток может все еще оставаться в памяти и выполнении.

7
задан John Saunders 17 March 2010 в 14:06
поделиться

5 ответов

Как сказал Шон, вы должны выполнять всю обработку исключений и очистку внутри метода потока, вы не можете сделать это при инициализации потока. Например:

public void Run()
{
    try
    {
        Thread thread1 = new Thread(ThreadEntry1);
        thread1.Start();

        Thread thread2 = new Thread(ThreadEntry2);
        thread2.Start();
    }
    catch (NotImplementedException)
    {
        // Neither are caught here
        Console.WriteLine("Caught you");
    }
}

private void ThreadEntry1()
{
    throw new NotImplementedException("Oops");
}

private void ThreadEntry2()
{
    throw new NotImplementedException("Oops2");
}

Вместо этого этот подход является более автономным и, очевидно, также работает:

public void Run()
{
    Thread thread1 = new Thread(ThreadEntry1);
    thread1.Start();
}

private void ThreadEntry1()
{
    try
    {
        throw new NotImplementedException("Oops");
    }
    catch (NotImplementedException)
    {
        Console.WriteLine("Ha! Caught you");
    }
}

Если вы хотите узнать, произошел ли сбой потока, вам следует рассмотреть массив WaitHandles и сигнал обратно вашему вызывающему методу. Альтернативный и более простой подход - просто увеличивать счетчик каждый раз, когда операция потока завершается:

Interlocked.Increment(ref _mycounter);
5
ответ дан 7 December 2019 в 01:19
поделиться

Вы можете перехватывать исключения внутри потоков, как если бы вы выполняли любую обычную функцию. Если ваша "рабочая" функция для потока называется DoWork, сделайте что-то вроде этого:

private void DoWork(...args...)
{
try
{
// Do my thread work here
}
catch (Exception ex)
{
}
}
1
ответ дан 7 December 2019 в 01:19
поделиться

Если вы беспокоитесь о подобных вещах, то вам следует обернуть точку входа в поток в блок try/catch и выполнять очистку явно. Любое исключение, переданное из точки входа в поток, приведет к завершению работы приложения.

2
ответ дан 7 December 2019 в 01:19
поделиться

А. У вас есть стек вызовов, и вы можете поймать его внутри потока и добавить идентификатор потока в журнал, я думаю ...

Если вы правильно оберните свой поток, вы можете добавить код очистки в раздел catch, завершение потока при необходимости.

1
ответ дан 7 December 2019 в 01:19
поделиться

Eric Lippert недавно опубликовал пост о вреде исключений, возникающих в рабочих потоках. Стоит прочитать и понять, что исключение является "исключительным", и единственное, в чем вы можете быть уверены после исключения в рабочем потоке - это то, что вы больше не можете быть уверены в состоянии вашего приложения.

1
ответ дан 7 December 2019 в 01:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: