练习消息队列的一个小例子 没什么技术含量 代码也没规范
有关于MSMQ方法介绍:
使用create方法创建你指定路径的消息队列,使用delete方法删除一个已经存在的消息队列.
使用exists方法判别是否存在一个消息队列.
使用GetPublicQueues方法获取消息队列网络中的一个消息队列
使用Peek或者是BeginPeek方法查看消息队列中的消息,而不会删除它们
使用Receive或者上BeginReceive方法从消息队列中取出一个消息,同时在消息队列中删除它.
使用Send方法,送一个消息到指定的消息队列中.
引用using System.Messaging;
一个小类
public class aa
{
private string _id;
private string _name;
public string id
{
get { return _id; }
set { _id = value; }
}
public string name
{
get { return _name; }
set { _name = value; }
}
}
发送代码(form1)
private void button1_Click(object sender, EventArgs e)
{
MessageQueue mq = null;
string mqName = ".//Private$//myqueue";
if (MessageQueue.Exists(mqName))
mq = new MessageQueue(mqName);
else
mq = MessageQueue.Create(mqName, false);
aa a = new aa();
a.id = textBox1.Text;
a.name = textBox2.Text;
mq.Formatter = new XmlMessageFormatter(new Type[]{typeof(aa)});
mq.Send(a, "xiao");
//删除队列
//MessageQueue.Delete(".//Private$//myqueue");
}
接受队列(测试要显示在listbox里所以建立了一个代理 form2)
delegate void Lists(string s);
public System.Messaging.Message m = new System.Messaging.Message();
接收
private void button1_Click(object sender, EventArgs e)
{
MessageQueue mq = new MessageQueue(".//Private$//myqueue");
mq.Formatter = new XmlMessageFormatter(new Type[] { typeof(aa) });
mq.ReceiveCompleted += new ReceiveCompletedEventHandler(bb);
mq.BeginReceive();
}
private void bb(object source, ReceiveCompletedEventArgs asyncResult)
{
try
{
MessageQueue mq = (MessageQueue)source;
m = mq.EndReceive(asyncResult.AsyncResult);
Lists l = new Lists(addlist);
if (m.Body.ToString() != null)
{
aa a = (aa)m.Body;
Invoke(l, a.id + "----" + a.name);
}
mq.BeginReceive();
}
catch (MessageQueueException e)
{
MessageBox.Show(e.Message);
}
return;
}
private void addlist(string str)
{
listBox1.Items.Add(str);
}
上面在WinForm程序运行正常,在系统服务中报错无法检索消息列表,
原因是没设置访问权限的问题,把上面
if (MessageQueue.Exists(mqName))
mq = new MessageQueue(mqName);
else
mq = MessageQueue.Create(mqName, false);
改成
if (MessageQueue.Exists(mqName))
mq = new MessageQueue(mqName);
else
{
mq = MessageQueue.Create(mqName, false);
/可以根据实际情况自己设置
mq.SetPermissions("Everyone", MessageQueueAccessRights.FullControl);
}