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

29 篇文章 0 订阅

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

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

}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C#中,可以使用System.Messaging命名空间中的MessageQueue类来创建消息队列。以下是一个简单示例代码,演示如何创建和发送消息到消息队列中: ```csharp using System.Messaging; // 创建消息队列 MessageQueue queue = null; if (!MessageQueue.Exists(@".\MyQueue")) { queue = MessageQueue.Create(@".\MyQueue"); } else { queue = new MessageQueue(@".\MyQueue"); } // 发送消息到队列中 Message message = new Message("Hello, World!"); queue.Send(message); ``` 在上面的代码中,我们首先检查是否已经存在名称为“MyQueue”的消息队列。如果不存在,则创建一个新的队列。然后,我们创建一个包含“Hello, World!”文本内容的消息,并将其发送到队列中。 为了从队列中读取消息,我们可以使用以下代码: ```csharp // 从队列中接收消息 MessageQueue queue = new MessageQueue(@".\MyQueue"); Message message = queue.Receive(); Console.WriteLine(message.Body.ToString()); ``` 在这里,我们创建一个新的MessageQueue对象来引用我们之前创建的队列。然后,我们调用Receive()方法来从队列中获取下一个可用的消息。最后,我们使用Console.WriteLine()方法将消息的内容打印到控制台上。 需要注意的是,消息队列是一种异步通信机制,因此在发送消息之前,您应该确保接收方已经启动并准备好接收消息。如果消息队列中没有可用的接收方,则发送操作将会失败。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值