Как прервать потоки, созданные с ThreadPool.QueueUserWorkItem - PullRequest
17 голосов
/ 26 августа 2008

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

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

Ответы [ 6 ]

15 голосов
/ 26 августа 2008

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

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

10 голосов
/ 28 августа 2008

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

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

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

3 голосов
/ 26 августа 2008

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

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

2 голосов
/ 26 августа 2008

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

0 голосов
/ 10 июня 2009

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

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

volatile bool stop = false;

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

0 голосов
/ 22 мая 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...