当前位置:首页>网络学院>程序开发>c#教程>文章内容

使用微软消息队列实现C#进程间通信

[ 来源:www.it55.com | 作者: | 时间:2007-07-14 | 收藏 | 推荐 ] 【

 顾名思义,微软消息队列(MSMQ)是一种给队列发送消息以便稍后进行处理的方法。消息由一个“Producer”(生产者)应用程序发送出去,再由一个“Consumer”(消费者)应用程序返回。

IT资讯之家 www.it55.com

 这两个应用程序可以在同一台机器上,在整个网络中,或甚至是位于并不总是连接在一起的不同机器上。MSMQ具有故障保险特性,因为如果第一次传送失败,它会重新发送消息。这样可保证你的应用程序消息到达它们的目的地。

www.it55.com在线教程

 我将应用一个叫做“TechRepublic”的队列。当你运行本文下载版本中的样本实例时,如果这个队列不存在,它会自动建立。 www.it55.com

 在前面的一篇文章中,Zach Smith说明了如何使用IPC通道在同一台机器上的两个进程间通信。他将在本文中说明如何在同一台机器或网络上的应用程序间实现进程间通信。 www.it55.com在线教程

访问MSMQ

www.it55.com

 通过.NET访问队列由System.Messaging.MessageQueue对象完成。列表A说明了如何在一台名为“SRV-MESSAGING”的计算机上访问TechRepublic队列。

vd;k;l www.it55.com rdfg

列表A it55.com

MessageQueue queue = new MessageQueue("SRV-MESSAGINGTechRepublic"); 
http://www.it55.com/

注:要应用这个对象,你必须在你的项目中添加一个参考。 sflj www.it55.com kg^&fgd

 现在我们有了一个MessageQueue对象,这个对象为你提供与队列交互需要的所有功能。

vd;k;l www.it55.com rdfg

 如果队列不存在,你可以调用MessageQueue对象的静态Create方法编程建立队列。列表B中的代码说明如何检查队列是否存在,建立队列或给队列添加一个参考。

www.it55.com

列表B

免费资源www.it55.com

MessageQueue queue = null;

www.it55.com

string queueName = "SRV-MESSAGINGTechRepublic";

www.it55.com

if (MessageQueue.Exists(queueName)) sflj www.it55.com kg^&fgd

queue = newMessageQueue(queueName);

www.it55.com在线教程

else vd;k;l www.it55.com rdfg

queue = MessageQueue.Create(queueName, false);

http://www.it55.com/

45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

改写队列

it55.com

改写队列时,用到MessageQueue.Send方法。列表C举例说明如何向TechRepublic队列发送一条消息。

45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

列表C www.it55.com

queue.Send("My message body", "Message Label"); 
http://www.it55.com/

 在这个例子中,我们给TechRepublic队列发送一条正文为“My message body”的消息,并对这个消息应用了一个“Message Label”标签。消息标签允许你不需阅读消息正文就可以分割消息。如果从计算机管理控制台中查看队列,还可在“队列消息”部分看到这些标签。 http://www.it55.com/

读取队列

IT资讯之家 www.it55.com

 可以使用几种方法从队列中读取消息。最常见的情况是从队列中取出所有消息,然后一次性处理它们。这时要调用MessageQueue.GetAllMessages方法。列表D举例说明如何应用这个方法。 http://www.it55.com/

列表D

 System.Messaging.Message[] messages = queue.GetAllMessages();

foreach (System.Messaging.Message message in messages)

免费资源www.it55.com

{

免费资源www.it55.com

//Do something with the message.

http://www.it55.com/

}

IT资讯之家 www.it55.com

45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

 你也可以用GetMessageEnumerator2方法代替上面的MessageQueue.GetAllMessages方法。虽然这两个方法的用法类似,但GetMessageEnumerator2只能向前(forward-only)。对于非常庞大的队列,则应用使用这个方法,而不是MessageQueue.GetAllMessages方法。

vd;k;l www.it55.com rdfg

 这是因为GetAllMessages方法领取所有消息,把它们保存在当地内存中;而GetMessageEnumerator2方法只领取当前消息在本地保存,在调用MoveNext时才领取下一条消息。列表E举例说明了GetMessageEnumerator2方法的用法。这段代码检查队列中的每一条消息,再删除它。

IT资讯之家 www.it55.com

列表E IT资讯之家 www.it55.com


MessageEnumerator enumerator = queue.GetMessageEnumerator2(); www.it55.com在线教程

while (enumerator.MoveNext())

45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

enumerator.RemoveCurrent(); 

www.it55.com在线教程

免费资源www.it55.com

 在使用GetMessageEnumerator2方法时,还要考虑另外一个问题,即你要访问队列中增加的任何新消息,即使它们是在你调用GetMessageEnumerator2后再增加的。这假定新消息被添加到队列末尾。 vd;k;l www.it55.com rdfg

 如果你只希望返回队列中的第一条消息,你应该使用MessageQueue.Receive方法。这个方法会领取队列中的第一条消息,在这个过程中将它从队列中删除。由于消息在读取的时候被删除,你可以确保你的进程是唯一收到消息的进程。Receive方法的应用实例如列表F所示。

it55.com

列表F 45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

(编辑:IT资讯之家 www.it55.com

返回顶部
共3页: 上一页 1 [2] [3] 下一页  

网友评论

[以下评论为网友观点,不代表本站。请自觉遵守互联网相关政策法规,所有连带责任均有评论者自负。]
[不超过250字]

图片文章