WinForm 和 Windows Service 通信 消息队列

如题,WinForm 和 Windows Service 通信,就是应用程序和系统服务通信,可以看成是进程间的通信。通信的方式有很多,这里只介绍通过消息队列(MessageQueue)方式。理论知识就不介绍了,直接介绍实例吧。

一、建立工程

建立3个项目,其中,

Common 为类库,包含错误日志类(Log.cs)和数据库访问类(MsSql.cs)

ServiceDemo 为Windows Service服务,包含安装类(Installer1.cs)和服务类(Service1.cs)

ServiceDesk 为WinForm应用程序,包含一个主窗口类(frmMain.cs)

这3个项目要实现的功能是,进程间通信,具体怎么通信呢?这里我设计的是用ServiceDesk这个WinForm实时监控ServiceDemo这个系统服务。ServiceDesk和ServiceDemo之间的通信就通过消息队列(MessageQueue)方式。

对了,补充下理论,消息队列必须安装后才能用,安装步骤如下:

控制面板->添加或删除程序->添加或删除组件

选择应用程序服务器详细信息

勾上消息队列

安装完就可以通过控制面板->管理工具->计算机管理->服务和应用程序访问了

二、书写服务

Service1.cs

public partial class Service1 : ServiceBase
    {
        Thread m_thread1;

        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            if (m_thread1 != null && m_thread1.ThreadState != System.Threading.ThreadState.Aborted)
            {
                m_thread1.Abort();
            }

            m_thread1 = new Thread(new ThreadStart(Work));
            m_thread1.IsBackground = true;
            m_thread1.Start();
        }

        protected override void OnStop()
        {

        }

        private void Work()
        {
            while (true)
            {
                //try
                //{
                //    string sql = "insert into T_Log(DateTime,Description)values({0},{1})";
                //    sql = String.Format(sql, DateTime.Now.ToString(), "adsf");

                //    int Result = Common.MsSql.ExecuteNonQuery(sql, this.GetType());
                //}
                //catch (Exception e)
                //{
                //    Common.Log.Write(e);
                //}


                string msg = "消息内容测试";
                SendMessage(msg);

                System.Threading.Thread.Sleep(500);
            }
        }

        void SendMessage(string msg)
        {
            try
            {
                string QueuePath = "./private$/aaaa";
                MessageQueue MQueue;

                if (!MessageQueue.Exists(QueuePath))
                {
                    return;
                }

                MQueue = new MessageQueue(QueuePath);

                System.Messaging.Message Msg = new System.Messaging.Message();
                Msg.Body = msg;

                //XML格式化传输量较大
                //Msg.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
                Msg.Formatter = new System.Messaging.Binary

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值