.NET使用消息队列示例

消息队列是Windows 2000、Windows XP、Windows Server 2003的一个组件,并将继续包含在Windows Vista和以后的Windows服务器中。即使目标接收应用程序没有运行,或运行发送或接收应用程序的计算机没有联网,协同合作的应用程序仍能利用消息队列在彼此之间发送和接收消息。在到达目标队列之前,消息由消息队列存储并转发。接收应用程序能够从队列中恢复数据。

消息队列的主要特点在于它分离发送和接收应用程序,使其不必同时运行。这意味着一个应用程序能够把数据存放在队列中,而不用理会队列中的项目是否被传送到接收应用程序。

消息队列包含两个重要的概念:队列和消息。队列用于存放消息,一个队列可以存储多个消息。.NET提供了两个相关的类:MessageQueue类用于管理队列,Message类用于管理消息。

一、安装消息队列组件

①.在控制面板中打开'添加或删除程序",打开"添加/删除Windows组件":


②.双击"应用程序服务器",找到并钩选"消息队列",然后安装:


③.安装完后在计算机管理的"服务和应用程序"下可看到它:


二、使用消息队列

1.简单消息发送和接收

using System;
using System.Messaging;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @".\private$\MzwuCom";
            MessageQueue queue;
            Message msg;

            //创建队列
            if (!MessageQueue.Exists(path))
                queue = MessageQueue.Create(path);
            else
                queue = new MessageQueue(path);

            //往队列发送消息
            queue.Send("www");
            queue.Send("mzwu");
            queue.Send("com");

            //接收消息
            queue.Formatter = new XmlMessageFormatter(new string[] { "System.String" });
            try { msg = queue.Receive(TimeSpan.FromSeconds(5)); } //Receive每次取第一个消息,并在队列中将其删除
            catch { msg = null; }
            while (msg != null)
            {
                Console.WriteLine(msg.Body.ToString());
                try { msg = queue.Receive(TimeSpan.FromSeconds(5)); }
                catch { msg = null; }
            }

            Console.ReadKey();
        }
    }
}

2. 复杂消息发送和接收

using System;
using System.IO;
using System.Messaging;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @".\private$\MzwuCom";
            MessageQueue queue;
            Message msg;
            FileInfo info;

            //创建队列
            if (!MessageQueue.Exists(path))
                queue = MessageQueue.Create(path);
            else
                queue = new MessageQueue(path);

            //往队列发送消息
            msg = new Message();
            msg.Formatter = new BinaryMessageFormatter();
            msg.Body = new FileInfo(@"c:\www.txt");
            queue.Send(msg);
            msg.Body = new FileInfo(@"c:\mzwu.txt");
            queue.Send(msg);
            msg.Body = new FileInfo(@"c:\com.txt");
            queue.Send(msg);

            //接收消息
            queue.Formatter = new BinaryMessageFormatter();
            try { msg = queue.Receive(TimeSpan.FromSeconds(5)); }
            catch { msg = null; }
            while (msg != null)
            {
                info = msg.Body as FileInfo;
                if (info != null)
                    Console.WriteLine(info.Name);
                try { msg = queue.Receive(TimeSpan.FromSeconds(5)); }
                catch { msg = null; }
            }

            Console.ReadKey();
        }
    }
}


评论: 0 | 引用: 0 | 查看次数: 4097
发表评论
登录后再发表评论!