Как завершить поток в С#?
Я хотел попробовать удачу в потоковом с С#, я знаю несколько вещей о потоковом в C.
Поэтому я просто хотел спросить, хочу ли я прекратить поток, я должен сделать это с помощью smt.Abort()
или он "уничтожит себя" после завершения функции?
Кроме того, есть что-то вроде pthread_exit()
в C в С#?
Извините за мой английский.:)
Ответы
Ответ 1
Thread.Abort
будет "убивать" поток, но это примерно эквивалентно:
Сценарий: вы хотите отключить компьютер.
Решение: вы платите динамит на свой компьютер, зажигаете его и запускаете.
Лучше запускать "условие выхода", либо через CancellationTokenSource.Cancel
, либо установить (безопасный доступ) "bool и т.д.", и вызвать Thread.Join
. Это больше похоже на:
Сценарий: вы хотите отключить компьютер.
Решение: вы нажимаете кнопку "Пуск", выключаете и ждете, пока компьютер не отключится.
Ответ 2
Прекращение потока извне (из-за потока) - плохая идея; вы никогда не знаете, что поток был в середине дела, когда вы убиваете его асинхронно. В С#, если ваша функция потока возвращается, поток заканчивается.
Эта статья MSDN Как создавать и завершать потоки (руководство по программированию на С#) содержит несколько заметок и некоторый пример кода, который вы, вероятно, найдете полезным.
Ответ 3
Вам не нужно завершать поток вручную после завершения функции.
Если вы создаете поток для запуска метода, как только метод вернет, поток будет автоматически отключен, так как ему больше нечего выполнять. *
Вы можете, конечно, вручную прервать поток, просто называя Abort()
, но это в значительной степени не рекомендуется из-за потенциального повреждения потока потока из-за ненадежного определения того, где поток находится в текущем состоянии выполнения. Если вам нужно самому справиться с убийством потоков, лучше всего использовать CancellationToken. Вы также можете прочитать статью Отмена управляемых потоков в MSDN.
** То есть, если вы не используете ThreadPool для выполнения своей работы. Вы не должны беспокоиться о прерывании этих потоков, поскольку они повторно используются в разных задачах, стоящих в очереди.
Ответ 4
Thread.Abort()
Thread.Join();
Thread = null;