5)消息格式化器
MessageQueue 类有一个Formatter属性,通过它可以指定格式化器。
3种格式化器 :
XmlMessageFormatter是默认的格式化器,它使用xml串行化对象。
BinaryMessageFormatter用二进制格式对消息进行串行化。这些消息比使用xml格式化的消息短。
ActiveMessageFormatter是一个二进制格式化器。。。。
System.Messaging.MessageQueue queue = null;
if (!MessageQueue.Exists(".\\Private$\\MSMQDemo8"))
{
queue = MessageQueue.Create(".\\Private$\\MSMQDemo8");
}
else
{
queue = new MessageQueue(".\\Private$\\MSMQDemo8");
}
// Create message
System.Messaging.Message message = new System.Messaging.Message();
message.Body = txtMessage.Text.Trim();
message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
// Put message into queue
queue.Send(message);
System.Messaging.MessageQueue queue = new MessageQueue(".\\Private$\\MSMQDemo8");
// Receive message, 同步的Receive方法阻塞当前执行线程,直到一个message可以得到
message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
System.Messaging.Message message = queue.Receive();
txtReceiveMessage.Text = message.Body.ToString();
1)枚举消息:使用迭代器时,消息不会从队列中删除,但可以查看他们的内容。
System.Messaging.MessageQueue queue = new MessageQueue(".\\Private$\\MSMQDemo8");
// Receive message, 同步的Receive方法阻塞当前执行线程,直到一个message可以得到
message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
foreach(Message message in queue)
{
txtReceiveMessage.Text = message.Body.ToString();
}
还可以使用MessageEnumerator实现了IEmumerator接口
实现了IEnumerable接口就表示不从队列中删除消息。
MessageEnumerator类的RemoverCurrent()方法可以从枚举器的当前光标位置删除消息。
using(MessageEnumerator message=queue.GetMessageEnumerator())
{
while(message.MoveNext(TimeSpan.FormMinutes(30)))
{
Message message=messages.Current;
message.Body;
}
}
2)异步读取
MesssageQueue类的Receive方法会等到队列中的消息可以读取为止。
为了避免阻碍线程的执行,可以再Receive方法的一个重载版本中指定一个超时的设置。
要从超时后读取队列中的消息,必须再次调用Receive()方法。
调用BegionReceive()异步方法,在这之前应设置ReceiveCompleted事件
queue.ReceiveCompleted+=new ReceiveCompletedEventHander(MessageArrived);
queue.BegionReveive();
MessageArrived方法处理程序需要两个参数,第一个是事件源messagequeue,第二个参数
public static void messagearrived(object source, ReceiveCompletedEnventArgs e )
{
MessageQueue queue=(MessageQueue)source;
Message message=queue.EndReceive(e.AsyncResult);
message.Body;
}
3)实例::::::::::