3

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

经过一番研究,我决定在我的应用程序中使用 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. 睡眠(100);}?

谢谢。

4

1 回答 1

14

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

在您的情况下,您可能不需要自己生成线程。只需在应用程序的主线程中打开您的 ServiceHost。然后你可以在你的主线程中做其他事情,当你准备好杀死主机时,只需调用 serviceHost.Close()。

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

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

于 2009-05-31T19:55:18.583 回答