【问题标题】:WCF:: ServiceHost: Oddity...Still alive even if thread is dead?WCF:: ServiceHost: Oddity...即使线程死了还活着吗?
【发布时间】:2009-05-31 19:35:03
【问题描述】:

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

经过一番研究,我决定在我的应用程序中使用 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 仍然在处理和处理请求,即使它的主线程(创建它的线程)已经死了?

还有一种更好的方法可以让 ServerThread 保持活动状态然后一段时间(true){Thread.睡眠(100);}?

谢谢。

【问题讨论】:

    标签: .net wcf multithreading servicehost


    【解决方案1】:

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

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

    我找到了一个很好的描述:

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

    【讨论】:

    • 这是正确的答案...我今天没有票了 ;)
    • 嗯,有些事情表明它并不像看起来那么简单。我刚刚写了一个没有产生线程的简单程序。在这个简单的 porgram 中,我创建了 ServiceHost 并 Opened() 它。紧接着,我创建了一个连接到服务主机的客户端。并且客户端失败了(我猜它死锁了)。如果我在单独的线程上创建该 ServiceHost(即使线程退出),客户端调用也会成功。那么,如果 Open() 已经产生了处理线程,为什么客户端调用会在同一个线程上失败呢?
    • 你应该能够做到这一点,我刚刚写了一个小测试程序,它可以按照你的描述进行操作并且它有效。你得到什么错误?可能是您的 app.config system.serviceModel 部分中没有配置您的客户端。
    • 嗨,安迪,客户端调用只是停止了,再也没有回来,程序对 Windows 变得“无响应”。如果我所做的 only 更改是在新线程而不是主线程中创建 ServiceHost线程(其他一切都保持不变)。
    • OK Andy...我尝试了之前在独立 C# exe 中不起作用的代码,客户端成功地在同一个线程上调用服务器。早些时候,我在某个应用程序(如插件 DLL)加载的 DLL 上的线程上尝试该代码......但失败了。我想知道如果服务器和客户端在 DLL 和独立 exe 中的同一线程上会有什么区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多