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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

Да, они являются фоном, но f.ex, если у вас есть приложение, в котором вы используете ThreadPool для какой-то множественной загрузки или чего-то еще, и вы хотите остановить их, как вы остановитесь? мое предложение было бы: exit asap, f.ex

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

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

Ответ 6

По словам Лукаса Шалкаускаса.

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

volatile bool stop = false;

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