Как прервать потоки, созданные с помощью ThreadPool.QueueUserWorkItem

есть ли способ прервать потоки, созданные с помощью QueueUserWorkItem?

А может мне и не нужно? Что произойдет, если основное приложение закроется? Все потоки, созданные из него, автоматически прерываются?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
18
0
21 299
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Да, они будут. Однако, если вы используете неуправляемые ресурсы в этих потоках, вы можете столкнуться с большим количеством проблем.

Ответ принят как подходящий

Вам не нужно их прерывать. Когда ваше приложение завершает работу, .NET убивает все потоки с IsBackground = true. В пуле потоков .NET для всех потоков установлено значение IsBackground = true, поэтому вам не о чем беспокоиться.

Теперь, если вы создаете потоки, обновляя класс Thread, вам нужно либо прервать их, либо установить для их свойства IsBackground значение true.

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

Если вы хотите прервать поток самостоятельно, вам придется либо управлять потоком самостоятельно (чтобы вы могли вызвать Thread.Abort () для объекта потока), либо вам придется настроить какой-либо механизм уведомления, который позволит вам сообщить потоку, что он должен прерваться.

However, if you are using unmanaged resources in those threads, you may end up in a lot of trouble.

Это скорее будет зависеть от того, как вы их использовали - если эти неуправляемые ресурсы были должным образом обернуты, то с ними будет работать финализация их оболочки независимо от механизма, используемого для уничтожения потоков, которые ссылались на них. И неуправляемые ресурсы освобождаются ОС, когда приложение все равно закрывается.

Существует общее ощущение, что (Windows) приложения тратят слишком много времени на очистку при завершении работы приложения - часто это связано с подкачкой огромных объемов памяти, чтобы ее можно было снова сбросить (или код подкачки, который работает вокруг освобождение неуправляемых объектов, с которыми ОС будет иметь дело в любом случае).

да, они фоновые, но, к примеру, если у вас есть приложение, в котором вы используете ThreadPool для какой-то разновидности многократной загрузки или чего-то подобного, и вы хотите их остановить, как вы остановитесь? мое предложение было бы: выйти из потока как можно скорее, например

bool stop = false;
void doDownloadWork(object s) 
{
   if (!stop)
   {
       DownloadLink((String)s, location);
   }
}

и если вы установите stop = true, вторые (в настоящее время в очереди) потоки автоматически завершатся после того, как потоки очереди завершат его обработку.

Согласно ответу Лукаса Шалкаускаса.

Но вы должны использовать:

volatile bool stop = false;

чтобы сообщить компилятору, что эта переменная используется несколькими потоками.

ключевое слово volatile предназначено для гораздо более конкретных целей, чем просто переменная, используемая несколькими потоками. Есть хорошие времена для его использования и плохие, хотя использование в этом сценарии кажется подходящим. Я просто не хотел, чтобы кто-нибудь подумал, что они должны делать это для всех переменных с многопоточным доступом. Это все равно, что сказать, что вы никогда не должны использовать транзакции и всегда указывать подсказки без блокировки в SQL, когда этот оператор очень сильно зависит от имеющегося решения.

TheXenocide 04.06.2010 02:01

Другие вопросы по теме