消息队列MSMQ

首先是将windows的MQ功能开启。


新建两个windows应用程序,用来测试消息传输


发送消息的代码

        MessageQueue mq;
        private void Form1_Load(object sender, EventArgs e)
        {
            //新建消息循环队列或连接到已有的消息队列
            string path = ".\\private$\\killf";
            if (MessageQueue.Exists(path))
            {
                mq = new MessageQueue(path);
            }
            else
            {
                mq = MessageQueue.Create(path);
            }

            mq.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
        }

        private void button1_Click(object sender, EventArgs e)
        {
            mq.Send(textBox1.Text);
        }

用于接收的代码

        MessageQueue mq;
        private void Form1_Load(object sender, EventArgs e)
        {
            //新建消息循环队列或连接到已有的消息队列
            string path = ".\\private$\\killf";
            if (MessageQueue.Exists(path))
            {
                mq = new MessageQueue(path);
            }
            else
            {
                mq = MessageQueue.Create(path);
            }

            mq.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
            mq.ReceiveCompleted += mq_ReceiveCompleted;
            mq.BeginReceive();
        }

        void mq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
        {
            //throw new NotImplementedException();
            MessageQueue mq = (MessageQueue)sender;
            System.Messaging.Message m = mq.EndReceive(e.AsyncResult);

            //处理消息
            string str = m.Body.ToString();
            this.textBox1.Invoke(new Action<string>(ShowMsg), str);

            //继续下一条消息
            mq.BeginReceive();
        }
        private void ShowMsg(string msg)
        {
            this.textBox1.Text = this.textBox1.Text + msg + Environment.NewLine;
            return;
        }

测试完成!


OK.png

1、命名空间 using System.Messaging;
2、默认存储路径 C:\WINDOWS\system32\msmq\storage
3、创建消息队列:

MessageQueue mq = MessageQueue.Create(@".\Private$\LeeMSMQ");

4、删除队列:

MessageQueue.Delete(@".\Private$\LeeMSMQ");

5、发送消息:

MessageQueue mq = new MessageQueue(@".\Private$\LeeMSMQ");
            mq.Send("sayhello1,hello msmq!", "sayhello1");
            mq.Send("sayhello2,hello msmq!", "sayhello2");

6、接受并删除消息:

MessageQueue mq = new MessageQueue(@".\Private$\LeeMSMQ")
Message msg = mq.Receive();//引用的队列中可用的第一条消息

7、接受但不删除消息:

Message msg = mq.Peek();

8、删除所有消息:

Message msg = mq.Purge();

9、返回本机所有私有队列的消息

      //返回本机所有私有队列的消息
             foreach (MessageQueue mq in MessageQueue.GetPrivateQueuesByMachine("liyanping"))
            {
                mq.Formatter = new XmlMessageFormatter(new string[] { "System.String" });
                Message[] msg = mq.GetAllMessages();
                foreach (Message m in msg)
                {
                    Console.WriteLine("label:{0},body:{1}", m.Label, m.Body);
                }
            }

10、返回指定队列的消息

            if (MessageQueue.Exists(@".\Private$\LeeMSMQ"))//判断私有消息是否存在
            {
                using (MessageQueue mq = new MessageQueue(@".\Private$\LeeMSMQ"))
                {
                    mq.Formatter = new XmlMessageFormatter(new string[] { "System.String" });//设置消息队列格式化器
                    Message msg = mq.Receive();//接收消息
                    Console.WriteLine("label:{0},body: {1}", msg.Label, msg.Body);//输出消息
                    MessageQueue.Delete(@".\Private$\LeeMSMQ");
                }
            } 
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,828评论 19 139
  • 最近有一个项目,是IOCP架构接收设备socket连接,设备侧已经算稳定,但数据解析后存储在mssql的数据库,影...
    云云与健健阅读 3,848评论 0 0
  • Part.5 他与她再无交集,唯一的交集在网上。那阵子群里流行真心话大冒险。因为他在,所以她也参...
    往秋也阅读 1,400评论 0 1
  • 澄清是本能啊,澄清得有用,你要在职场混,有一件事情是你的基础,你要把你自己所有的思维和观念统一到三个词上,目标,方...
    绿竹巷老婆婆阅读 5,858评论 0 0
  • 天桥手写经典: 人生,应该有几个这样的朋友 有共同的爱好,亦或追求 天桥手写经典,每日一篇经典语录,手写呈现。百度...
    天桥手写阅读 2,548评论 0 0

友情链接更多精彩内容