C#使用Microsoft消息队列(MSMQ)的示例详解

 更新时间:2024年01月05日 08:42:50   作者:rjcql  
Microsoft Message Queuing (MSMQ) 是在多个不同的应用之间实现相互通信的一种异步传输模式,本文主要介绍了C#如何使用Microsoft消息队列,需要的可以了解下

写在前面

Microsoft Message Queuing (MSMQ) 是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。

使用消息队列可以实现异步通讯,无需关心接收端是否在线,只需发出后就可以继续处理后续的任务,通讯双方也可以是不同的物理平台,该机制还可以用来实现故障恢复。

在使用前,需要先确认该功能是否安装和启用,如未安装可以参考以下操作步骤:

进入控制面板\所有控制面板项\程序和功能,点击启用或关闭Windows功能,勾选Microsoft消息队列,确认并安装。

消息队列分为以下几种,每种队列的路径表示形式如下:

公用队列 MachineName\QueueName

专用队列 MachineName\Private$\QueueName

日记队列 MachineName\QueueName\Journal$

计算机日记队列 MachineName\Journal$

计算机死信队列 MachineName\Deadletter$

计算机事务性死信队列 MachineName\XactDeadletter$

代码实现 

需要引用 System.Messaging 类库

using System.Messaging;

发送端

    public partial class Form1 : Form
    {
        MessageQueue queue;
        string path = ".\\Private$\\testQueue";
        public Form1()
        {
            InitializeComponent();
            CreateMessageQueue();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            SendMessage(this.textBox1.Text);
        }
 
        private void CreateMessageQueue()
        {
            if(MessageQueue.Exists(path))
            {
                queue = new MessageQueue(path);
            }
            else
            {
                queue = MessageQueue.Create(path);
            }
        }
 
        private void SendMessage(string str)
        {
            var message = new System.Messaging.Message();
            message.Formatter = new XmlMessageFormatter(new Type[]{ typeof(string)});
            message.Body = str;
            queue.Send(message);
            MessageBox.Show("消息发送成功");
        }
 
        private void SendMessage(Image image)
        {
            var message = new System.Messaging.Message();
            message.Formatter = new BinaryMessageFormatter();
            message.Body = image;
            queue.Send(message);
            MessageBox.Show("图像发送成功");
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog open = new OpenFileDialog();
            open.Filter = "图像文件|*.jpg;*.bmp;*.png";
            open.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
            if(open.ShowDialog() == DialogResult.OK)
            {
                Image image = Bitmap.FromFile(open.FileName);
                SendMessage(image);
            }
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            MessageBox.Show(queue.GetAllMessages().Length.ToString());
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
            queue.Purge();
        }
    }

接收端

    public partial class Form1 : Form
    {
        MessageQueue queue;
        string path = ".\\Private$\\testQueue";
        public Form1()
        {
            InitializeComponent();
            CreateMessageQueue();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            RecvStringMessage();
        }
 
 
        private void button2_Click(object sender, EventArgs e)
        {
            RecvImageMessage();
        }
 
        private void CreateMessageQueue()
        {
            if (MessageQueue.Exists(path))
            {
                queue = new MessageQueue(path);
            }
            else
            {
                queue = MessageQueue.Create(path);
            }
        }
 
        public void RecvStringMessage()
        {
            if (queue.GetAllMessages().Length == 0)
            {
                MessageBox.Show("消息队列为空");
                return;
            }
            var message = queue.Receive();
            message.Formatter = new XmlMessageFormatter(new Type[] {typeof(string) });
            MessageBox.Show(message.Body.ToString());
        }
 
        public void RecvImageMessage()
        {
            if (queue.GetAllMessages().Length == 0)
            {
                MessageBox.Show("消息队列为空");
                return;
            }
            var message = queue.Receive();
            message.Formatter = new BinaryMessageFormatter();
            Image image = (Image)message.Body;
            Form form = new Form();
            form.Width = 1024;
            form.Height = 768;
            PictureBox pbox = new PictureBox();
            pbox.Width = 1024;
            pbox.Height = 768;
            pbox.SizeMode = PictureBoxSizeMode.Zoom;
            pbox.Image = image;
            form.Controls.Add(pbox);
            form.ShowDialog();
        }
    }

调用示例

 可以在计算机管理中查看到消息队列的详细信息,还未被接收的消息会在队列消息中看到,被接收并消费后即自动删除。

源码参考:C#消息队列MSMQ

以上就是C#使用Microsoft消息队列(MSMQ)的示例详解的详细内容,更多关于C# Microsoft消息队列的资料请关注脚本之家其它相关文章!

相关文章

  • C#实现的二维数组排序算法示例

    C#实现的二维数组排序算法示例

    这篇文章主要介绍了C#实现的二维数组排序算法,涉及C#针对二维数组的遍历、判断、排序等相关操作技巧,需要的朋友可以参考下
    2017-12-12
  • C#获取汉字字符串拼音首字母的方法

    C#获取汉字字符串拼音首字母的方法

    这篇文章主要介绍了C#获取汉字字符串拼音首字母的方法,实例分析了C#操作汉字及字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • C# 重写Notification提示窗口的示例代码

    C# 重写Notification提示窗口的示例代码

    本文主要介绍了C# 重写Notification提示窗口的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • C# 使用SharpZipLib生成压缩包的实例代码

    C# 使用SharpZipLib生成压缩包的实例代码

    SharpZipLib是一个C#的类库,主要用来解压缩Zip,GZip,BZip2,Tar等格式,是以托管程序集的方式实现,可以方便的应用于其他的项目之中。本文通过一个实例代码给大家介绍了C# 使用SharpZipLib生成压缩包的方法,感兴趣的朋友跟随小编一起看看吧
    2018-09-09
  • 浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题

    浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题

    下面小编就为大家分享一篇浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题,具有很好的参考价值,希望对大家有所帮助
    2017-11-11
  • C#使用linq查询大数据集的方法

    C#使用linq查询大数据集的方法

    这篇文章主要介绍了C#使用linq查询大数据集的方法,涉及C#调用linq进行数据查询的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C# 8.0新特性介绍

    C# 8.0新特性介绍

    C# 语言是在2000发布的,至今已正式发布了7个版本,每个版本都包含了许多令人兴奋的新特性和功能更新。下面通过本文给大家分享下C# 8.0的三个令人兴奋的新特性,需要的朋友参考下吧
    2017-10-10
  • c# 复写Equals方法的实现

    c# 复写Equals方法的实现

    本文主要介绍了c# 复写Equals方法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C# partial关键字说明

    C# partial关键字说明

    C# 中可以将类、结构或接口的定义拆分到两个或多个源文件中,在类声明前添加partial关键字即可,通过本文给大家介绍C# partial关键字说明,需要的朋友参考下
    2016-02-02
  • 使用VS2010 C#开发ActiveX控件(下),完整代码打包下载

    使用VS2010 C#开发ActiveX控件(下),完整代码打包下载

    我们介绍了开发、打包、发布、使用ActiveX控件的全过程。在演示程序中,我们没有调用串口通信和读卡器Dll程序,由于我们读卡器的原始Dll是使用其它语言进行开发的,对C#来说,是非托管代码,因此我们还需要在代码级别进行非托管代码的安全性设置
    2011-05-05

最新评论