C# 等待WCF服务的最佳方式?

C# 等待WCF服务的最佳方式?,c#,.net,wcf,C#,.net,Wcf,我正在做一个基本的自托管WCF服务,我只是想知道最好的方法是让它在接受请求时等待?我找到的所有基本教程都只是使用Console.ReadLine等待用户按enter键退出。对于实际应用程序来说,这似乎不是一个非常实用的方法。我试了一会儿(真的);循环,但这消耗了所有可用的CPU周期,因此它不是一个选项。我还尝试了Thread.Sleep(0),但该服务在睡眠时不会接受请求,因此这也不起作用。我相信有一些常见的方法让你的程序“暂停”等待WCF请求;有人知道怎么做吗 我使用的是C#,.NET 3.5

我正在做一个基本的自托管WCF服务,我只是想知道最好的方法是让它在接受请求时等待?我找到的所有基本教程都只是使用Console.ReadLine等待用户按enter键退出。对于实际应用程序来说,这似乎不是一个非常实用的方法。我试了一会儿(真的);循环,但这消耗了所有可用的CPU周期,因此它不是一个选项。我还尝试了Thread.Sleep(0),但该服务在睡眠时不会接受请求,因此这也不起作用。我相信有一些常见的方法让你的程序“暂停”等待WCF请求;有人知道怎么做吗


我使用的是C#,.NET 3.5 sp1。

如果在单独的线程中运行此程序(因为它是自托管的),一个简单的选择是使用ManualResetEvent

只需调用
manualResetEvent.WaitOne()。这将阻塞(如Console.ReadLine),直到从单独的线程调用
manualResetEvent.Set()


这里的好处是,您可以有一个干净的机制来关闭服务。

一个真正的应用程序,如果没有UI,作为Windows服务可能会更好。您可以在服务的OnStart方法中设置WCF服务主机,然后在OnStop中将其拆下


示例通常使用控制台应用程序的原因是,在安装和运行服务时,很容易演示,而不会将读者与无关代码混淆。但是,如果您的服务器没有交互式UI,我建议您研究Windows服务项目模板。

在控制台应用程序中运行WCF服务很容易。我无法使自托管WCF在windows服务中工作。可能有太多的安全问题需要处理。为了改进托管示例的控制台应用程序服务,我制作了一个AttachService方法,它在自己的线程上运行,如下所示

public static AutoResetEvent manualReset;

// Host the service within this EXE console application.
public static void Main()
{
  manualReset = new AutoResetEvent(false);

  ThreadPool.QueueUserWorkItem(AttachService);

  //put Set() signal in your logic to stop the service when needed
  //Example:
  ConsoleKeyInfo key;
  do
  {
    key = Console.ReadKey(true);
  } while (key.Key != ConsoleKey.Enter);
  manualReset.Set();
}
static void AttachService(Object stateInfo)
{
  // Create a ServiceHost for the CalculatorService type.
  using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), new Uri("net.tcp://localhost:9000/servicemodelsamples/service")))
  {
    // Open the ServiceHost to create listeners and start listening for messages.
    serviceHost.Open();

    // The service can now be accessed.

    //Prevent thread from exiting
    manualReset.WaitOne(); //wait for a signal to exit
    //manualReset.Set();
  }
}

我的目标是使用OnStart方法中的Process类从Windows服务执行此控制台应用程序。感谢@Reed Copsey对WaitOne()的建议。

beautiful。这正是我想要的。我会尽快将此作为可接受的答案。关闭机制也是一个很大的帮助。他提到这是一个自托管服务。这有很多实际用途,包括将WCF服务托管在Windows窗体应用程序中,等等。这通常涉及设置一个线程来托管WCF服务,使用一些技术,比如等待句柄来防止它关闭……自托管服务只是意味着他正在引导WCF,而不是IIS或其他主机进程。Windows服务是非交互式自托管服务的推荐应用程序类型。值得注意的是,Thread.Sleep(0)的睡眠时间仅足以让其他线程运行,然后返回。它不会产生等待任何一段时间的效果。您可能已经为Thread.Sleep(Timeout.Infinite)(值为-1)指定了无限期阻塞,但ManualResetEvent比这更好。很高兴知道。谢谢你的帮助!已测试并从Process.Start()开始工作。在Windows 10中,它仅在Windows服务在ServiceAccount.LocalSystem下运行时起作用。否则,我无法使用NET.TPC绑定通过此异常:System.ServiceModel.AddressAccessDeniedException位于System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen()。您还需要从OnStop()覆盖运行Process.Kill(),否则在Windows服务停止后,WCF服务将在系统上保持运行。