Итак, давайте посмотрим, что у вас есть:
- У вас есть метод, выполняющийся в потоке
TheadPool
. - Этот метод вызовет исключение.
- Исключение не будет обрабатываться блоком
try-catch
. - Приложение работает за пределами IDE.
Теперь мы можем легко проверить это с помощью следующего кода.Обратите особое внимание на приведенные ниже наблюдения, особенно на смелые, поскольку они интересны в контексте вашего вопроса.
public static void Main()
{
ThreadPool.QueueUserWorkItem(
(state) =>
{
throw new InvalidOperationException();
}, null);
while (true)
{
Thread.Sleep(1000);
Console.WriteLine(DateTime.Now.ToString());
}
}
При работе вне среды IDE вы увидите следующее.
- Появится диалоговое окно с сообщением «[приложение] столкнулось с проблемой и должно быть закрыто. Приносим извинения за неудобства».
- Приложение продолжит работу и напечатает текущеевремя каждую секунду.
- Приложение будет завершено после нажатия кнопки Закрыть в диалоговом окне.
При работе внутри IDE 1 вы увидите следующее.
- Среда IDE перехватит исключение и отобразит его, используя свое собственное необработанное окно исключения.
- Все потоки будут остановлены, что означает, что вы не увидитетекущее время отображается.
- Игнорирование исключения и возобновление сеанса отладки позволят начать отображение текущего времени.
- Среда IDE снова сбросит исключение и перехватит его.
- Все потоки будут остановлены и цикл будет повторяться бесконечно.
1 Я проверял это в Visual Studio 2010.