一个简单的C#消息队列示例

来源:互联网 发布:学阀 知乎 编辑:程序博客网 时间:2024/05/16 14:45

练习消息队列的一个小例子 没什么技术含量 代码也没规范

有关于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);

}

 

原创粉丝点击