Исключение, брошенное в пул потоков - PullRequest
2 голосов
/ 28 июля 2011

У меня есть пул потоков, и я использую библиотеку, которая при выполнении определенных условий выдает исключение. У меня вопрос, если это заканчивается в IDE, остановится ли поток или остановится вся программа?

Ответы [ 3 ]

3 голосов
/ 28 июля 2011

Итак, давайте посмотрим, что у вас есть:

  • У вас есть метод, выполняющийся в потоке 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.

3 голосов
/ 28 июля 2011

Если приложение - .Net 2+, необработанное исключение в неосновном потоке сгладит процесс.

Вы можете настроить это поведение, используя параметр app.config LegacyUnhandledExceptionPolicy, но я бы не сталНе рекомендую это, так как это потенциально маскирует серьезные ошибки.

Обновление

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

try
{
    //Call WebService
}
catch(System.Net.WebException ex)
{
   //Ignore
}
1 голос
/ 28 июля 2011

Когда отладчик ломает программу, все потоки останавливаются.

На экране Debug -> Windows -> Threads вы можете видеть темы. Вы можете «заморозить» поток, что означает, что он будет остановлен, если вы продолжите запускать программу.

Таким образом, некоторые потоки можно остановить даже во время работы отладчика. Обратное невозможно: ни один поток не может работать, когда отладчик находится в режиме прерывания.

...