2015-05-07 3 views
-2

Название гласит все. Я запускаю сценарий веб-тестирования Selenium, который я хочу, чтобы сделать паузу при нажатии кнопки пользователя. Thread.Suspend() работает отлично, но я все время вижу, как вы не должны его использовать, но никто не знает подробно о том, почему вы не должны его использовать.C# - почему Thread.Suspend() так плохо?

Есть ли обстоятельства, когда это действительно не так, но это одна из тех вещей, которые вы, вероятно, не должны использовать в привычке?

Или мир серьезно закончится, если я использую thread.suspend, чтобы временно остановить простой скрипт?

В моем случае я хочу, чтобы нить НЕМЕДЛЕННО остановилась при нажатии кнопки пользователя. Все другие решения, позволяющие избежать thread.suspend() с использованием флагов и еще что-то не так, как я хочу, чтобы они были в этой ситуации.

Так может кто-нибудь объяснить мне, почему thread.suspend() - такая плохая идея, если все, что я делаю, это простой скрипт?

+4

Ответ на вопрос прямо в документации соответствующего метода. Что вы не поняли? – Servy

ответ

2

От http://www.albahari.com/threading/part4.aspx#_Suspend_and_Resume

С .NET 2.0, Приостановка и возобновление устарели, их использование не рекомендуется из-за опасности, присущей произвольно подвешивания другой поток. Если поток, удерживающий блокировку на критическом ресурсе, приостанавливается, все приложение (или компьютер) может блокироваться. Это гораздо более опасно, чем вызов Abort - что приводит к тому, что любые такие блокировки освобождаются (по крайней мере теоретически) на основе кода в блоках finally.

Однако безопасно вызывать Suspend для текущего потока - и при этом вы можете реализовать простой механизм синхронизации - с рабочим потоком в цикле, выполнить задачу, вызывая Suspend на себе, а затем ждать («разбудить») по основному потоку, когда другая задача будет готова. Однако трудность заключается в определении того, приостановлен ли рабочий.

Я добавлю, что последняя часть верна, только если вы знаете, что у вас нет замков. Это может быть довольно сложно (если вы приостановите метод C, который вызывается из метода B и из метода A, можете ли вы быть уверенным, что оба метода B и метод A не блокируют что-либо?). Но эта проблема, в общем, существует, даже если вы хотите иметь несколько блокировок одновременно: создание взаимоблокировки всегда возможно, если вы не очень хорошо и очень методично.

+0

ОК, поэтому по «замкам» вы просто имеете в виду оператор блокировки? это, вероятно, ясно из моего вопроса, но я не очень хорошо осведомлен о C# или потоковом в общем. если по блокировкам вы DO означаете операторы блокировки, тогда я знаю, что у меня нет блокировок. так значит ли это, что thread.suspend() не будет концом света, если я его использую? – kdeez

+0

@ kdeez Я заблокировал блокировку, которая может блокировать и ждать ... 'lock' (это' Monitor'), все различные 'WaitHandle',' Семафор' ... – xanatos

+0

Ну ладно, да, я «Я определенно не использую ничего подобного. И после внедрения thread.suspend() и thread.resume() и тестирования его на приличную сумму, ничего критически неправильного, похоже, не происходит. так это значит, что я, наверное, хорошо? Кроме того, вы знаете, совершая кардинальный грех против лучшей практики. – kdeez

Смежные вопросы