windows服务通信和线程

本文关键字:线程 通信 服务 windows | 更新日期: 2023-09-27 18:26:57

我已经阅读了很多关于windows服务和线程的教程/帮助台(包括本教程),以找出实现以下目标的最佳方法。我想不出一些事情,所以现在我想知道我是否选择了正确的方式,如果我选择了,我该如何实现它

目标:我需要在后台执行5个独立的任务,所以我想创建一个windows服务。除了服务,我还想要一个表格申请表来显示有关服务的信息。根据我所读到的内容,我应该使用套接字服务器来处理通信。

我的计划:

  1. 创建windows服务
  2. 创建一个异步套接字服务器类,并在onstart方法中启动它
  3. 当套接字服务器正确启动并准备就绪时,调用一个方法在主服务startTasks上
  4. 使用executeTask方法为每个任务创建一个单独的类
  5. 在startTasks方法中,我将为每个任务启动一个线程,以便它们都可以同时运行
  6. 当任务有要报告的内容时,它应该在名为sendData(msg)的主服务
  7. senddata方法应该调用套接字服务器类中的方法将消息发送到所有连接的客户端

问题出在3、6和7上,涉及"在其他线程/类上调用方法"。

  • 当准备好了
  • 我如何通过这个服务器从一个单独的线程发送数据

简化服务:

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();
    }
}

windows服务通信和线程

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

其次,用executeTask方法为每个任务创建一个单独的类,听起来像是来自Java世界或可运行对象。在C#中,您可以将任务编码为单独的方法,并将它们作为异步执行的任务来启动。当他们有东西要报告给客户端时,他们可以通过客户端和服务器之间的双工通道将其发送给客户端。

在这个项目中使用WCF和TPL应该可以解决你描述的所有问题,并让你及时回家吃晚饭。现在,使用这些更新的技术可能需要一点时间,但它会为您节省大量时间,因为它的代码更短,更容易传输,而且漏洞空间更小。

问候Gert Jan