Подтвердить что ты не робот

Как завершить поток в С#?

Я хотел попробовать удачу в потоковом с С#, я знаю несколько вещей о потоковом в C.

Поэтому я просто хотел спросить, хочу ли я прекратить поток, я должен сделать это с помощью smt.Abort() или он "уничтожит себя" после завершения функции?

Кроме того, есть что-то вроде pthread_exit() в C в С#?

Извините за мой английский.:)

4b9b3361

Ответ 1

Thread.Abort будет "убивать" поток, но это примерно эквивалентно:

Сценарий: вы хотите отключить компьютер.

Решение: вы платите динамит на свой компьютер, зажигаете его и запускаете.

Лучше запускать "условие выхода", либо через CancellationTokenSource.Cancel, либо установить (безопасный доступ) "bool и т.д.", и вызвать Thread.Join. Это больше похоже на:

Сценарий: вы хотите отключить компьютер.

Решение: вы нажимаете кнопку "Пуск", выключаете и ждете, пока компьютер не отключится.

Ответ 2

Прекращение потока извне (из-за потока) - плохая идея; вы никогда не знаете, что поток был в середине дела, когда вы убиваете его асинхронно. В С#, если ваша функция потока возвращается, поток заканчивается.

Эта статья MSDN Как создавать и завершать потоки (руководство по программированию на С#) содержит несколько заметок и некоторый пример кода, который вы, вероятно, найдете полезным.

Ответ 3

Вам не нужно завершать поток вручную после завершения функции.

Если вы создаете поток для запуска метода, как только метод вернет, поток будет автоматически отключен, так как ему больше нечего выполнять. *

Вы можете, конечно, вручную прервать поток, просто называя Abort(), но это в значительной степени не рекомендуется из-за потенциального повреждения потока потока из-за ненадежного определения того, где поток находится в текущем состоянии выполнения. Если вам нужно самому справиться с убийством потоков, лучше всего использовать CancellationToken. Вы также можете прочитать статью Отмена управляемых потоков в MSDN.

** То есть, если вы не используете ThreadPool для выполнения своей работы. Вы не должны беспокоиться о прерывании этих потоков, поскольку они повторно используются в разных задачах, стоящих в очереди.

Ответ 4

Thread.Abort()
Thread.Join();
Thread = null;