2013-06-20 5 views
1

Я создал приложение для работы с окнами, в котором я открываю около 10000 потоков, я хочу закрыть все потоки, как все фоновые потоки закрываются, когда я закрываю приложения winform, как я могу это сделать? я не хочу хранить ссылку на все эти потоки в массиве и закрывать все, используя цикл.Как закрыть все фоновые потоки приложения Windows Service?

Прежде, чем я использовал приложение Winform, и когда я закрыл приложение winform, все фоновые потоки становятся закрытыми. Я хочу сделать что-то подобное, чтобы закрыть все потоки в приложении Windows Service

Любая идея будет очень оценена.

+0

Если вы просто обработать сообщение остановки и не делать ничего другого, операционная система должна прекратить все нити после ~ 20 секунд. –

+0

Я не понимаю, что вы имеете в виду? Вы имели в виду, если я просто переопределяю сообщение OnStop и ничего не делаю, чтобы остановить все потоки? или вы имели в виду, если я не переоцениваю метод OnStop, он закроет все потоки? –

+0

В моем переопределении это просто «base.OnStop();» –

ответ

3

Если вы установите свойство нити myThread.isBackground = true, поток будет умирать, поскольку все потоки переднего плана убиты (когда вы закрываете приложение).

Однако создание 10 000 потоков не очень хорошо, так как операционная система будет тратить больше времени на переключение между потоками, чем на самом деле выполнение кода потоков. Выполнение этого большого потока на обычных компьютерах будет фактически менее эффективным, чем выполнение 2 - 16 потоков (например) на 2 - 4 ядрах.

Вот отличная электронная книга по нарезке.

PDF: http://www.albahari.info/threading/threading.pdf Web: http://www.albahari.com/threading/

+0

Если все потоки переднего плана убиты, потоки фонов также закончится? Поэтому, если приложение закрыто, все фоновые потоки будут заканчиваться так же, как и OP, не оставляя следов всех из них. – VinceAnity

+0

Таким образом, если использование большого количества потоков не является хорошей практикой, можете ли вы рассказать мне, как я должен использовать для создания TCP-сервера, обслуживающего 10000 клиентов. –

+0

Предполагая, что весь процесс выполняется на одной машине, вы можете использовать поток пул, который позволяет вам ставить в очередь рабочие элементы. Все очень хорошо объяснено в электронной книге, связанной с моим ответом (http://www.albahari.com/threading/#_Thread_Pooling). – VinceAnity

-1

Я вижу два варианта, чтобы достичь своей цели:

  1. Попросите Application Service, чтобы начать другую исполняемую программу, которая отвечает за подачу нити. Затем попросите приложение-службу убить эту исполняемую программу, когда это необходимо. Потоки, порожденные исполняемой программой, будут убиты, но не служба.

  2. Положите условие прерывания в бегущую нить. Путем установки булевского флага вы можете отключить свои потоки от while (true) и выйти из делегата Runnable. (Здесь я предполагаю, что ваши потоки постоянно работают в while (true), иначе вы не стали бы задавать этот вопрос).

+0

'10000 нитей' - я сомневаюсь, что они работают! –

+0

Нечего сомневаться, это сервер, поэтому он должен работать. –

+0

Я имел в виду, что они не все текущее состояние, т.е. большинство/все блокировано чем-то, (читается сеть, предположительно). –

-2

Если вы просто обрабатываете сообщение остановки и ничего не предпринимаете, ОС должна остановить все оставшиеся потоки в процессе обслуживания через ~ 20 секунд.

+0

Почему downvote? Я тестировал это, он работает. Он работает, если потоки заблокированы. Он работает, если нить спала. Он работает, если потоки запущены. –

+0

Вопрос OP в основном сводится к «Я понятия не имею, что я делаю. Как я могу выбраться из ямы, в которой я?» Правильный ответ от VinceAnity: «Узнайте, как делать то, что вы делаете, прежде чем делать это. И вот хорошее начало». К сожалению, ваш ответ сводится к: «Вам не нужно знать, что вы делаете. ОС будет автоматически магия для вас». Хотя в наши дни это становится общим взглядом на разработку программного обеспечения, это все еще ужасно. –

+0

@ StephenMartin почему страшно? Учитывая сложное многопоточное приложение в непредсказуемом состоянии в то время, когда вы хотите его закрыть, как вы предлагаете его остановить? a) Проектируйте, разрабатывайте, пишите, проверяйте нагрузку сложного, сложного, вероятно ненадежного кода отключения потока, который пытается остановить потоки как в заблокированных, так и в запущенных состояниях. b) Вызвать ExitProcess (0). «Чистое закрытие потоков» с помощью кода пользователя во многих приложениях просто нереалистично. Только ОС имеет инструменты для остановки всех потоков во всех состояниях на всех ядрах, прежде чем освобождать используемые ресурсы. –

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