Как Вы могли узнать что Exception
произошедший в a Thread
в Приложении MultiThreaded? и последовательно чистый ресурсы?
Поскольку иначе Поток может все еще оставаться в памяти и выполнении.
Как сказал Шон, вы должны выполнять всю обработку исключений и очистку внутри метода потока, вы не можете сделать это при инициализации потока. Например:
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);
Вы можете перехватывать исключения внутри потоков, как если бы вы выполняли любую обычную функцию. Если ваша "рабочая" функция для потока называется DoWork, сделайте что-то вроде этого:
private void DoWork(...args...)
{
try
{
// Do my thread work here
}
catch (Exception ex)
{
}
}
Если вы беспокоитесь о подобных вещах, то вам следует обернуть точку входа в поток в блок try/catch и выполнять очистку явно. Любое исключение, переданное из точки входа в поток, приведет к завершению работы приложения.
А. У вас есть стек вызовов, и вы можете поймать его внутри потока и добавить идентификатор потока в журнал, я думаю ...
Если вы правильно оберните свой поток, вы можете добавить код очистки в раздел catch, завершение потока при необходимости.
Eric Lippert недавно опубликовал пост о вреде исключений, возникающих в рабочих потоках. Стоит прочитать и понять, что исключение является "исключительным", и единственное, в чем вы можете быть уверены после исключения в рабочем потоке - это то, что вы больше не можете быть уверены в состоянии вашего приложения.