-1

我正在编写一个名为管道服务器的 WCF。我有这样的事情:

class Program
{
    static void Main(string[] args)
    {
        using(var host = new ServiceHost(typeof(XServer), new Uri("net.pipe://localhost")))
        {
            host.AddServiceEndpoint(typeof(IXServer), new NetNamedPipeBinding(), "XServer");
            host.Open();
        }
    }
}

击中host.Open();程序后停止工作。这个程序应该是一个服务器,所以它必须一直运行。我该怎么做?我需要在while(true)之后添加循环host.Open()吗?因为那个解决方案在我看来很蹩脚。

4

2 回答 2

2

一般来说,你会做这样的事情: -

class Program
{
  static void Main(string[] args)
  {
    using(var host = new ServiceHost(typeof(XServer), new Uri("net.pipe://localhost")))
    {
      host.AddServiceEndpoint(typeof(IXServer), new NetNamedPipeBinding(), "XServer");
      host.Open();
      create an exit event
      while (true)
      {
        begin asynchronous read
        wait on asynchronous read or exit event <- puts thread to sleep
        if event was exit event, break out of while loop
        parse read data
      }
      destroy exit event
    }
  }
}

退出事件为您提供了一种干净地终止进程的方法,使用事件可以让操作系统减少程序在等待数据到达时消耗的 CPU 时间。

于 2013-09-13T16:24:57.093 回答
1

您可以做的最基本的事情(阻塞!)是:

class Program
{
     private static ManualResetEventSlim _manualResetEventSlim;
     static void Main(string[] args)
     {
        using(var host = new ServiceHost(typeof(XServer), new Uri("net.pipe://localhost")))
        {
          host.AddServiceEndpoint(typeof(IXServer), new NetNamedPipeBinding(), "XServer");
          host.Open();      
          _manualResetEventSlim.Wait(); //This will **block** the application thread, But its not supposed to block your WCF Service host thread. 
        }
}

}

不要忘记在 Dispose() 上设置事件。

于 2013-09-13T16:54:20.020 回答