как поймать ThreadAbort? - PullRequest
       3

как поймать ThreadAbort?

1 голос
/ 31 августа 2011

У меня есть функция, где я вызываю thread.abort, чтобы убить поток.Я знаю, что это не лучшая практика, но я вызываю функцию в dll, которая в своей основе имеет бесконечный цикл в этой функции, поэтому единственный способ завершить поток - вызвать прерывание потока.Я могу вызвать thread.join, но тогда мой графический интерфейс застрянет.Я сделал перехват как в приложении формы, так и в этом потоке, но когда я вызываю функцию thread.abort, возникает исключение, которое перехватывается моим блоком try в одном из этих мест, но мое приложение по-прежнему падает.

Как правильно обрабатывать threadAbort, чтобы он не приводил к сбою моего приложения.

Ответы [ 2 ]

6 голосов
/ 31 августа 2011

Ваше приложение аварийно завершает работу, потому что ThreadAbortException автоматически перебрасывается в конце любого блока catch, который его обрабатывает.Чтобы предотвратить его повторное выбрасывание, вам нужно позвонить Thread.ResetAbort().

try {
  ...
} catch (ThreadAbortException) {
  Thread.ResetAbort();
}

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

1 голос
/ 31 августа 2011

Не используйте Thread.Abort(), сигнализируйте об остановке нити.Что-то вроде

private volatile _keepRunning = true;

public void DoWork()
{
    while(_keepRunning)
    {
    }
}

public void Abort()
{
    _keepRunning = false;
}

Вы можете получить больше фантазии с ManualResetEvent s, чтобы быстрее сигнализировать об окончании и по-прежнему использовать соединение, но основная идея здесь есть.Я часто использую это в наших приложениях, это хорошо работает.

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