C# 使用 Windows 消息队列机制

本文介绍了一个基于Windows消息队列(MSMQ)的应用示例,包括如何创建队列、发送消息、枚举消息及清除队列等操作,并提供了完整的C#代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

保存消息队列数据的本地磁盘地址:C:\WINDOWS\system32\msmq\storage


注意:

   1,要使用 windows 消息队列机制,必须在该 windows 操作系统中先安装“ windows 消息队列” 组件系统光盘中)

   2,要使用启用消息队列,必须先启动“Messenger服务传输客户端和服务器之间的 NET SEND 和 Alerter 服务消息。此服务与 Windows Messenger 无关。如果服务停止,Alerter 消息不会被传输。如果服务被禁用,任何直接依赖于此服务的服务将无法启动。);

 

控件:

ExpandedBlockStart.gifForm1.Designer.cs
        private System.Windows.Forms.Button btnSendMessage;
        
private System.Windows.Forms.Button btnEnumerateMessages;
        
private System.Windows.Forms.TextBox txtMessages;
        
private System.Windows.Forms.Button btnRemoveMessages;
        
private System.Windows.Forms.Button btnSendHighestPriorityMessage;


代码:

ExpandedBlockStart.gif代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Messaging;
using System.Xml.Serialization;

namespace MessageQueuingExample
{
    
public partial class Form1 : Form
    {
        
//The . in the queueName represents localhost
        private const string queueName = ".\\Private$\\Liuq";
        
//private const string queueName = "A405\\Private$\\Liuq";

        
//We need this class-wide to access it in the methods.
        MessageQueue queue = null;

        
public Form1()
        {
            InitializeComponent();
        }

        
private void Form1_Load(object sender, EventArgs e)
        {
            
//Create the queue if it doesn't exist.
            CreateQueue();
        }

        
private void CreateQueue()
        {
            
//Does the queue already exist??
            if (MessageQueue.Exists(queueName))
                
//Yes, it's already there.
                queue = new MessageQueue(queueName);
            
else
                
//No, we need to create it.
                queue = MessageQueue.Create(queueName, false);
        }

        
private void btnSendMessage_Click(object sender, EventArgs e)
        {
            
//Instantiate our MessageContent object.
            MessageContent message = new MessageContent("Hello world!");

            
//Send it to the queue.
            queue.Send(message, "Sample Message");

            MessageBox.Show("Message sent.""MSMQ");
        }

        
private void btnEnumerateMessages_Click(object sender, EventArgs e)
        {
            
//Clear the textbox.
            this.txtMessages.Clear();

            
//Get all messages on the queue.
            System.Messaging.Message[] messages = queue.GetAllMessages();

            
//Loop through the messages.
            foreach (System.Messaging.Message message in messages)
            {
                
//Set the formatter for the message.
                message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[1] { typeof(MessageContent) });

                
//Get the MessageContent object out of the message.
                MessageContent content = (MessageContent)message.Body;

                
//Update the textbox.
                this.txtMessages.Text += content.MessageText + " - " + content.CreationDate.ToString() + "\r\n";
            }
        }

        
private void btnRemoveMessages_Click(object sender, EventArgs e)
        {
            
//Purge all messages from the queue.
            queue.Purge();

            MessageBox.Show("Messages purged""MSMQ");
        }

        
private void btnSendHighestPriorityMessage_Click(object sender, EventArgs e)
        {
            
//Create a XmlSerializer for the object type we're sending.
            XmlSerializer serializer = new XmlSerializer(typeof(MessageContent));

            
//Instantiate a new message.
            System.Messaging.Message queueMessage = new System.Messaging.Message();

            
//Set the priority to Highest.
            queueMessage.Priority = MessagePriority.Highest;

            
//Create our MessageContent object.
            MessageContent messageContent = new MessageContent("Hello world - IMPORTANT!");

            
//Serialize the MessageContent object into the queueMessage.
            serializer.Serialize(queueMessage.BodyStream, messageContent);

            
//Send the message.
            queue.Send(queueMessage, "HIGH PRIORITY");

            MessageBox.Show("Important message sent.""MSMQ");
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值