Windows侦听器服务

时间:2009-05-25 13:01:11

标签: c# multithreading windows-services tcplistener

如何在c#中编写一个监听tcp连接并处理这些连接的Windows服务?问题是我想要一个比在主线程中“阻塞”更好的方法,例如

while(true) ;

我可以在另一个线程上启动监听器,但主线程需要阻止以防止应用程序退出(并且服务停止)。 感谢。

3 个答案:

答案 0 :(得分:5)

为什么不使用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

答案 1 :(得分:3)

最好的方法是使用一个ManualResetEvent,它会阻止你发出信号。

答案 2 :(得分:0)

如果您不使用WCF,那么TcpListner就是您的选择。

当您继续使用此Windows服务时,您将需要某种类型的“心跳”来验证服务是否仍在运行。最简单的方法是使用计时器(例如,每分钟一次)更新数据库。这具有使服务“活着”的额外好处。