2008-08-25 6 views

ответ

14

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

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

2

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

3

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

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

10

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

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

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

0

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

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

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

+0

(ответ noet Guenther) – 2009-06-23 14:26:09

0

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

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

volatile bool stop = false; 

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

+0

ключевое слово volatile предназначено для гораздо более конкретных целей, чем просто переменная, используемая несколькими потоками. Есть хорошие времена, чтобы использовать его и плохие времена, хотя использование в этом сценарии кажется подходящим, я просто не хотел, чтобы кто-то придумал, что они должны делать это для всех переменных с несколькими потоками.Это похоже на то, что вы никогда не должны использовать транзакции и всегда указываете подсказки nolock в SQL, когда это утверждение очень сильно зависит от решения. – TheXenocide 2010-06-03 22:01:27

Смежные вопросы