C# 使用 Windows 消息队列机制

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

 

注意:

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

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

 

控件:

Form1.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;

 

代码:

复制代码
代码
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");
        }
    }
}
复制代码
posted @ 2012-07-09 15:25  sunny's blog  阅读(831)  评论(0编辑  收藏  举报