Сведения о вопросе

rjevskii

12:03, 12th August, 2020

Теги

c#   multithreading    

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

Просмотров: 514   Ответов: 6

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

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



  Сведения об ответе

PROGA

21:34, 23rd August, 2020

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

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


  Сведения об ответе

lesha

03:43, 1st August, 2020

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

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

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


  Сведения об ответе

DINO

11:30, 15th August, 2020

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

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


  Сведения об ответе

Chhiki

05:48, 28th August, 2020

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


  Сведения об ответе

VCe znayu

16:04, 23rd August, 2020

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

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

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


  Сведения об ответе

repe

23:41, 5th August, 2020

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

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

volatile bool stop = false;

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться