2010-06-13 3 views
0

У меня длинная рабочая нить из Thread.Start(). Он генерирует фоновый поток, используя QueueUserWorkItem, который большую часть времени спит.Как прекратить поток, который породил другой поток, который спит?

Тогда владелец класса будет удален, я вызываю thread1.Join(), но, естественно, он не возвращается, потому что его дочерний фоновый поток спал.

Что было бы правильным решением для изящного завершения потока, который имеет другие потоки с небольшим количеством хлопот?


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

На первом месте нить не хотела прекращаться не из-за фоновой нити. Но по другой причине.

Во-вторых - мне пришлось использовать таймер вместо этого, потому что я держал нить без причины - только ждать события, которое происходит один раз в день!

Это было очень глупо со мной :) Извините.

ответ

1

Как правило, полезно использовать нить потока ниток для краткосрочной резьбы. Если вам нужен фоновый поток, который будет работать в течение длительного времени, используйте новый экземпляр Thread и установите для его свойства Background значение true.

+0

Фоновая нить не спит большую часть времени. –

+0

@Bobb, в этом случае вы по-прежнему используете поток потока потока в течение длительного времени, даже если он только спит. этого следует избегать. –

+0

есть. см. мой «ответ» ниже. Я получил это немного позже :) –

0

Если вы используете .Abort, это вызовет ThreadAbortException в соответствующем потоке - ответьте на это так же изящно, как вы можете. Вы также можете использовать Begin/EndCriticalRegion.

+0

ThreadAbort - ужасный способ закончить поток. http://www.bluebytesoftware.com/blog/2009/03/13/ManagedCodeAndAsynchronousExceptionHardening.aspx – Alan

+0

http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation – Alan

+0

http: // msmvps.com/blogs/senthil/archive/2008/12/17/the-dangers-of-thread-abort.aspx – Alan

0

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

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