WCF :: ServiceHost: Странность ... Все еще жив, даже если поток мертв? - PullRequest
3 голосов
/ 31 мая 2009

новый член здесь. Приятно видеть такое аккуратное сообщество.

После небольшого исследования я решил использовать WCF в своем приложении для межпроцессного взаимодействия, поэтому я использую привязку NetNamedPipeBinding.

Хост-приложение ServiceHost не является выделенным сервером, поэтому оно должно порождать ServiceHost через поток. Пока все хорошо.

Итак, у меня есть что-то вроде следующего:

Foo()
{
    Thread serverThread = new Thread(new ThreadStart(ServerThread));
    serverThread.Start();
    Console.WriteLine("Foo Exited");
}

ServerThread()
{
   Uri baseAddress = new Uri("net.pipe://localhost/service");
   ServiceHost serviceHost = new ServiceHost(typeof(MyService), baseAddress);
   ...
   serviceHost.Open();
   Console.WriteLine("Server Thread Exited");
}

Итак, как и ожидалось, я вижу:

->   Server Thread Exited
->   Foo Exited

Но, к моему удивлению, несмотря на то, что поток, на котором запущен сервер, возбужден, клиент все равно может подключиться к serviceHost, а хост службы обрабатывает запрос правильно!

Так почему же ServiceHost все еще обрабатывает и обрабатывает запросы, даже если его основной поток (тот, на котором он был создан) мертв?

Также есть лучший способ сохранить ServerThread живым, чем некоторое время (true) {Thread. Sleep (100);}

?

Спасибо.

1 Ответ

14 голосов
/ 31 мая 2009

Когда вы вызываете Open на ServiceHost, будет создан дополнительный поток для прослушивания входящих запросов на обслуживание. Таким образом, ваш поток, возможно, завершил работу, но другой поток был создан и будет продолжать работать до тех пор, пока вы не вызовете «Закрыть» на ServiceHost.

В вашем случае, возможно, нет необходимости создавать поток самостоятельно. Просто откройте свой ServiceHost в главном потоке приложения. Затем вы можете делать другие вещи в своем основном потоке, и когда вы будете готовы убить хост, просто вызовите serviceHost.Close ().

Вот довольно хорошее описание, которое я нашел:

http://www.code -magazine.com / article.aspx? Quickid = 0701041 & страница = 1

...