背景
开发者经常遇到需要异步执行操作的情况(即过程不等到操作完成就开始)。消息队列提供一个中心位置或池,您可以在其中放置或从中提取数据,从而满足了这一要求。一个应用程序能够把消息存放在队列中,然后继续自己的业务,另一个应用程序在运行时再提取这些数据。
简单理解
感觉这里的消息队列还是一个典型的“buffer”思想:即就像喝水一样,如果有一杯水,我可能就直接喝掉了;但是如果有一壶水,我可能要先把水倒进杯子,然后再从杯子里喝水。
消息队列在这里起到了个杯子的作用。
代码示例
建立消息队列并发送一条消息
Message msg = null; //对列发送或读取的实际消息或数据
MessageQueue mq = null; //接收/发送消息的MSMQ消息队列
try
{
msg = new Message();
msg.Priority = MessagePriority.Normal;//普通消息的优先级
if (!MessageQueue.Exists(@".\Private$\TechRepublic"))
{
mq = MessageQueue.Create(@".\Private$\TechRepublic");
} //如果不存在则创建它
else
{
mq = new MessageQueue(@".\Private$\TechRepublic");
}
msg.Label = "Test Message";
msg.Body = "this is only a test";
mq.Send(msg);
Console.WriteLine("message sent");
}
catch (System.Messaging.MessageQueueException ex)
{
Console.WriteLine("MSMQ Error:" + ex.ToString());
}
catch (Exception ex)
{
Console.WriteLine("error:" + ex.ToString());
}
finally
{ mq.Close(); }
接收消息
Message msg = null;
MessageQueue mq = null;
try
{
mq = new MessageQueue(@".\Private$\Tepublic");
msg = mq.Receive(new TimeSpan(0, 0, 3));//timespan对象指定异常出现时系统的等待时间。
msg.Formatter = new XmlMessageFormatter(new string[] { "System.String,mscorlib" }); //对象被转换成字符串读取前面存储的文本
mq.Receive(); //从队列中读取消息,它的值显示在控制台中
Console.WriteLine(msg.Label.ToString() + "__" + msg.Body.ToString());
}
catch (System.Messaging.MessageQueueException ex)
{
Console.WriteLine("MSMQ Error"+ex.ToString());
}
catch(Exception ex)
{
Console.WriteLine("Error:"+ex.ToString());
}finally
{
mq.Close();
}
未完待续,具体问题还没分析~