WCF :: ServiceHost:奇怪......即使线程死了还活着?

时间:2009-05-31 19:35:04

标签: .net wcf multithreading servicehost

这里有新成员。很高兴看到这样一个整洁的社区。

经过一番研究后,我决定在我的应用程序中使用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保持活动状态一段时间(真实){Thread。休眠状态(100);}

感谢。

1 个答案:

答案 0 :(得分:14)

当您在ServiceHost上调用Open时,将创建一个额外的线程来侦听传入的服务请求。这样,您的线程可能已经完成运行,但是已经创建了另一个线程,并且将继续运行,直到您在ServiceHost上调用“关闭”。

在您的情况下可能没有必要自己生成一个线程。只需在应用程序的主线程中打开ServiceHost即可。然后,您可以在主线程中执行其他操作,当您准备好终止主机时,只需调用serviceHost.Close()。

我发现这是一个非常好的描述:

http://www.code-magazine.com/article.aspx?quickid=0701041&page=1