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





Да, они будут. Однако, если вы используете неуправляемые ресурсы в этих потоках, вы можете столкнуться с большим количеством проблем.
Вам не нужно их прерывать. Когда ваше приложение завершает работу, .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, когда этот оператор очень сильно зависит от имеющегося решения.