Прервать тему, начатую с Delegate.BeginInvoke - PullRequest
4 голосов
/ 01 февраля 2010

Отказ от ответственности : я знаю, что Thread.Abort это зло. Я использую его как последнее средство, поскольку некоторые функции ввода / вывода (например, File.Exists при использовании на несуществующем сетевом ресурсе) блокируют большой промежуток времени и не позволяют указывать время ожидания. *

Вопрос : Возможно ли прервать (как в Thread.Abort) рабочий поток, начавший использовать Delegate.BeginInvoke, или я должен сам выполнять обработку потоков?

Ответы [ 2 ]

3 голосов
/ 01 февраля 2010

Было бы опасно вызывать Abort для метода потока, который происходит внутри делегата, вызываемого с Delegate.BeginInvoke.

Delegate.BeginInvoke запускает делегата в потоке ThreadPool. Завершение потока ThreadPool через Abort может привести к появлению очень странных ошибок, так как ThreadPool не предназначен для этого.

Это, как говорится, также совершенно ненужно. Вы всегда должны быть в состоянии определить из потока ThreadPool, хотите ли вы прервать выполнение, и просто вернуться соответствующим образом. Если поток ThreadPool блокируется, это также не будет проблемой, так как он не блокирует ваш основной поток. Было бы лучше просто поставить чек после вашего блокирующего вызова (т.е. сразу после File.Exists) и просто вернуться, если вы хотите прервать в это время.

2 голосов
/ 01 февраля 2010

Единственный способ сделать это - передать делегату свой Thread.CurrentThread в основной поток.

Однако вы не должны этого делать; Завершение темы ThreadPool не очень хорошая идея. (Если вы не отмените прерывание в блоке catch)

Вам придется использовать собственные темы.

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