Есть ли способ обеспечить выполнение всего блока кода в потоке .NET? - PullRequest
2 голосов
/ 06 сентября 2008

В моей программе на C # у меня есть поток, представляющий текущий тест, который можно прервать, нажав на кнопку с надписью «Прерывание выполнения». Для того, чтобы поток (и, следовательно, тест) завершился элегантным образом (и выполнил некоторую важную работу заранее), эта кнопка активируется только в некоторые четко определенные моменты, в которые я ловлю ThreadAbortedException, выполняю Thread.ResetAbort() и умрёт красиво (то есть нить).

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

try {
} finally {
  // vital code
}

Однако другого решения я не нашел.

Это еще один способ отложить помехи ThreadAbortException до конца блока?

Ответы [ 2 ]

4 голосов
/ 06 сентября 2008

Ситуации, при которых будет сгенерировано исключение ThreadAbortException, могут быть сложными. Лучшим вариантом может быть вопрос, почему вы вообще используете ThreadAbortExceptions.

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

С этим шаблоном вы полностью контролируете, когда поток будет действовать на прерывание, и вам не придется беспокоиться о прерывании критических операций.

3 голосов
/ 06 сентября 2008

Использование Thread.BeginCriticalRegion ()

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

Thread.BeginCriticalRegion()

//do important stuff here

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