2014-11-20 2 views
3

Я читал в кучке мест, где я должен держаться подальше от Thread.Abort. И узнал, что это правда (похоже, это поведение, зависящее от платформы, на Mono) :)Хороший способ прервать нить (без Thread.Abort)

Итак, какой хороший/изящный способ прервать поток извне?

Я понимаю, что я могу добавить такой код:

if (terminateRequested) return; 

или лучше

if (terminateRequested) throw new MyTerminateThreadException(); 

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

А как насчет ситуаций, когда поток является Спящим, ожидающим подключения к серверу, мьютексом или исполняемым кодом, который не является моим? Как вы с ними справляетесь?

+1

http://stackoverflow.com/questions/3632149/question-about-terminating-a-thread-cleanly-in-net/3632642#3632642 - Возможно, помощь? – Unflux

+1

Слишком много разных сценариев, чтобы правильно ответить на этот вопрос за короткое пространство. Это действительно зависит от каждого конкретного сценария. Тем не менее, запрещая использование 'Thread.Abort()' (который я согласен - это ужасный способ прервать поток), вы почти наверняка проверяете какое-то состояние где-нибудь, если хотите, чтобы активно работающий поток прерывался. –

+1

Имеет ли Mono класс 'Task'? Если это так, вы можете использовать 'CancellationToken' для прерывания потока. – techvice

ответ

0

Я считаю, что Mono имеет Taskclass available. Я бы рекомендовал просмотреть с помощью CancellationToken. Просмотрите эту страницу Task Cancellation, чтобы получить лучшее представление о выполнении потока и его отмене.