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

StackOverflow https://stackoverflow.com/questions/26816

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

volatile bool stop = false;

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top