【发布时间】:2010-10-28 17:52:59
【问题描述】:
如何在 C# 中编写一个 Windows 服务来侦听 tcp 连接并处理这些连接?问题是我想要一个比在主线程中“阻塞”更好的方法,例如
而(真);我可以在另一个线程上启动侦听器,但主线程需要阻塞以防止应用程序退出(以及服务停止)。 谢谢。
【问题讨论】:
标签: c# multithreading windows-services tcplistener
如何在 C# 中编写一个 Windows 服务来侦听 tcp 连接并处理这些连接?问题是我想要一个比在主线程中“阻塞”更好的方法,例如
而(真);我可以在另一个线程上启动侦听器,但主线程需要阻塞以防止应用程序退出(以及服务停止)。 谢谢。
【问题讨论】:
标签: c# multithreading windows-services tcplistener
为什么不使用 WCF 服务? - 您可以在 Windows 服务中托管 WCF 服务....然后您可以使用 NetTcpBinding(以便通过 tcp 进行通信) 所以我们的代码看起来像
namespace WindowsService1
{
public partial class Service1 : ServiceBase
{
internal static ServiceHost myServiceHost = null;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
if (myServiceHost != null)
{
myServiceHost.Close();
}
myServiceHost = new ServiceHost(typeof(WcfServiceLibrary1.Service1));
myServiceHost.Open();
}
protected override void OnStop()
{
if (myServiceHost != null)
{
myServiceHost.Close();
myServiceHost = null;
}
}
}
}
以下是一些示例: http://www.pluralsight.com/community/blogs/aaron/archive/2008/12/02/screencast-hosting-wcf-services-in-windows-services.aspx http://msdn.microsoft.com/en-us/library/ms733069.aspx
【讨论】:
最好可能使用ManualResetEvent,它会阻塞直到你发出信号。
【讨论】:
如果你不使用 WCF,那么TcpListner 是要走的路。
随着您继续使用此 Windows 服务,您将需要某种类型的“心跳”来验证该服务是否仍在运行。最简单的方法是让计时器(例如,每分钟一次)更新数据库。这具有保持服务“活跃”的额外好处。
【讨论】: