Что лучший способ состоит в том, чтобы закончить многопоточное приложение в очевидном способе?
Я запускаю несколько сокетных соединений с основного потока в отдельных сокетах и ожидаю до конца моего рабочего дня в основном потоке и использовании в настоящее время System.Environment.Exit(0)
завершать его.
Это приводит к необработанному исключению в одном из childs. Я должен остановить потоки из списка? Я отказался реализовать любую реальную остановку в childs все же, таким образом я задаюсь вопросом о лучшей практике. Сокеты все перенесены приятно с надлежащими деструкторами для того, чтобы выйти из системы и закрыться, но это все еще приводит к ошибкам.
Для потоков, созданных вручную, вы должны установить для свойства IsBackground значение true. В этом случае (если все ваши потоки, кроме основного) будут фоновыми, ваше приложение будет корректно закрыто после возврата из функции Main (string [] arg).
P.S. Все потоки пулов потоков являются фоновыми.
Всякий раз, когда вы выполняете длительное заблокированное ожидание (например, ожидаете входящего соединения), используйте форму Begin / End метода. Затем используйте ManualResetEvent для представления условия «должен выйти». Затем заблокируйте AsyncWaitHandle и событие выхода. Это позволит вам аккуратно завершить работу.
Пример:
// exit is a ManualResetEvent
var asyncResult = socket.BeginAccept(null, null);
if(WaitHandle.WaitAny(new[] { exit, asyncResult.AsyncWaitHandle }) == 0)
return;
var connection = socket.EndAccept(asyncResult);
И в вашем основном методе, когда вы хотите выйти:
exit.Set();
прочтите статьи Джона Скита о многопоточности:
http://www.yoda.arachsys.com/csharp/threads/
, особенно «Изящное завершение рабочих потоков»:
http: / /www.yoda.arachsys.com/csharp/threads/shutdown.shtml