等待WCF服务的最佳方式?
我正在做一个基本的自托管WCF服务,我只是想知道什么最好的方法是让它等待,而它接受请求?我找到的所有基本教程都只是简单地使用Console.ReadLine来等待用户点击Enter退出。这对于真正的应用程序来说似乎不太实用。我试了一下(真);循环,但是这消耗了所有可用的CPU周期,所以它不是一个选项。我也尝试了Thread.Sleep(0),但该服务在睡眠时不会接受请求,所以这也不起作用。我确定有一些常见的方法让你的程序“失速”等待WCF请求;有谁知道如何?等待WCF服务的最佳方式?
我使用的是C#,.NET 3.5 SP1。
如果你在单独的线程中运行(自从它自己托管),一个简单的选择是使用ManualResetEvent。
只需在WCF线程中调用manualResetEvent.WaitOne();
即可。这将阻止(如Console.ReadLine),直到manualResetEvent.Set()
从单独的线程被调用。
这里的好处是您可以拥有一个关闭服务的干净机制。
美丽。这正是我所期待的。我会尽快将此作为接受的答案。关机机制也很有帮助。 – bunglestink 2011-01-12 02:15:17
一个真正的应用程序,如果它没有一个UI,可能会更好作为一个Windows服务。您可以在服务的OnStart方法中设置WCF服务主机,然后在OnStop中将其关闭。
这些示例通常使用控制台应用程序的原因是因为它很容易演示而不会使读者与无关代码混淆以便安装和运行服务。但是如果你的服务器没有交互式用户界面,我会建议调查Windows服务项目模板。
他提到这是一项自我托管服务。这有很多实际用途,包括在Windows窗体应用程序中托管WCF服务等。这通常包括设置一个线程来托管WCF服务,并使用一些技术(如等待处理来防止它关闭)。 .. – 2011-01-12 02:17:07
自托管服务只是意味着他引导WCF而不是IIS或其他主机进程。对于非交互式自托管服务,Windows服务是推荐的应用程序类型。 – Josh 2011-01-12 02:21:05
很容易让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()的建议。
值得注意的是,Thread.Sleep(0)只能休眠足够长的时间,让其他线程运行,然后返回。它不会有等待任何一段时间的效果。您可能已经注册了Thread.Sleep(Timeout.Infinite)(值为-1),该值将无限期阻止,但ManualResetEvent比此更好。 – Josh 2011-01-12 02:18:50
相关提示谢谢您的帮助! – bunglestink 2011-01-12 02:23:23