Windows服务通信和线程

时间:2012-03-06 09:00:14

标签: c# windows multithreading sockets service

我一直在阅读很多关于Windows服务和线程的教程/帮助台(包括这个),以找出实现以下目标的最佳方法。我无法弄清楚一些事情,所以现在我想知道我是否选择了正确的方式去做,如果我做了,我该如何实现它。

目标: 我需要在后台执行5个单独的任务,所以我想创建一个Windows服务。除了服务,我想要一个表单应用程序来显示有关服务的信息。根据我的阅读,我应该使用套接字服务器来处理通信。

我的计划:

  1. 创建Windows服务
  2. 创建异步套接字服务器类并在onstart方法
  3. 中启动它
  4. 当套接字服务器正确启动并准备就绪时,请调用方法 在主要服务startTasks。
  5. 使用executeTask方法为每个任务创建一个单独的类
  6. 在startTasks方法中,我将为每个任务启动一个线程,以便它们 都可以同时进行。
  7. 当一个任务要报告时,它应该调用一个方法 主要服务叫sendData(msg)
  8. senddata方法应该调用套接字服务器类中的方法 将msg发送给所有连接的客户端。
  9. 问题在于3,6和7,并且涉及“在其他线程/类上调用方法”。

    • 如何让asycn服务器调用startTasks方法 就绪
    • 如何通过此服务器从单独的线程发送数据。

    简化服务:

    public partial class SecurityCheck : ServiceBase
        {
            private ComServer _comServer;
            private CheckRequest _checkRequest;
    
            private readonly Thread[] _threads = new Thread[1];
            private int _tNr;
    
            public SecurityCheck()
            {
                InitializeComponent();
            }
    
            protected override void OnStart(string[] args)
            {
                _comServer = new ComServer();
            }
    
            protected override void OnStop()
            {
                _comServer.CloseSockets();
    
                if (_checkRequest != null)
                    _checkRequest.ServiceStarted = false;
    
                foreach (Thread t in _threads)
                {
                    if (t != null)
                        t.Join(new TimeSpan(0, 2, 0));
                }
            }
    
            internal void StartTasks()
            {
                _checkRequest = new CheckRequest { ServiceStarted = true };
                var st = new ThreadStart(_checkRequest.ExecuteTask);
                _threads[_tNr] = new Thread(st);
                _threads[_tNr].Start();
                _tNr++;
            }
    
            internal void SendData(string msg)
            {
                _comServer.SendData(msg);
            }
        }
    

    简化任务

    public class CheckRequest
    {
        public bool ServiceStarted;
    
        public CheckRequest()
        {
            //construct me
        }
    
        public void ExecuteTask()
        {
            while (ServiceStarted)
            {
                try
                {
                    //perform task
    
                    //what to do to send data?
                }
                catch (Exception ex)
                {
    
                }
    
                // yield
                if (ServiceStarted)
                {
                    Thread.Sleep(new TimeSpan(0, 0, 10));
                }
            }
    
            Thread.CurrentThread.Abort();
        }
    }
    

1 个答案:

答案 0 :(得分:0)

对于服务和客户端之间的通信,我肯定会使用(双工)WCF而不是套接字。这将为您节省大量繁琐和错误的编码。

其次,使用executeTask方法为每个任务创建一个单独的类听起来像是来自Java世界或可运行的对象。在C#中,您可以将任务编码为单独的方法,并将其作为task be executed asynchronously启动。当他们有东西向客户报告时,他们可以通过客户端和服务器之间的双工通道send it to the clients自己。

在这个项目中使用WCF和TPL几乎可以解决您描述的所有问题,并让您及时回家吃饭。现在可能花费一点时间来获得这些新技术,但它可以通过更短的代码更容易转移并减少错误空间来节省大量时间。

关心Gert-Jan