如何创建发送到本地消息队列的C#程序。

时间:2011-09-26 14:09:53

标签: c# msmq

我有一个C#程序试图发送到我自己的本地Windows消息队列。我已经安装了消息队列,并且绝望地在Message Queue本身和我正在尝试写入的Public队列上给了“Everyone”的所有访问权限。我有一个有两个文本框和两个按钮的表单。一对用于发送,另一对用于接收。我点击发送并没有错误,它可以检测到实际上有一个该名称的消息队列。但是send方法似乎没有实际进入队列。谢谢你的帮助!这是代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Messaging;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
    public MessageQueue myNewPublicQueue;
    private static object lockObject = new object();
    /// <summary>
    /// 
    /// </summary>
    public Form1()
    {
        InitializeComponent();
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void buttoSend_Click(object sender, EventArgs e)
    {
        if (MessageQueue.Exists(@".\queuename"))
        {
            myNewPublicQueue = new System.Messaging.MessageQueue(@".\queuename");
            System.Messaging.Message mm = new System.Messaging.Message();
            mm.Body = textBoxSend.Text;
            mm.Label = "First Test Message";
            myNewPublicQueue.Send(mm);

        }

    }

    private void buttonGet_Click(object sender, EventArgs e)
    {
        myNewPublicQueue.ReceiveCompleted += new          ReceiveCompletedEventHandler(queue_ReceiveCompleted);

        // Start listening.
        myNewPublicQueue.BeginReceive();

    }
    private void queue_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
    {


        lock (lockObject)
        {
            // The message is plain text.
            string text = (string)e.Message.Body;
            Console.WriteLine("Message received: " + text);
            textBoxGet.Text = text;
        }

        // Listen for the next message.
        myNewPublicQueue.BeginReceive();
    }
    public enum MessageType
    {
        MESSAGE_TYPE_PLAIN_TEXT = 0,
        MESSAGE_TYPE_HELLO_WORLD = 1
    };

    private void Form1_Load(object sender, EventArgs e)
    {

    }





    }
}

1 个答案:

答案 0 :(得分:1)

调用MessageQueue.Send()方法时,请检查消息队列中的“传出队列”文件夹。您应该看到已经设置了一个临时队列(注意,只有当目标队列位于发送计算机的另一台计算机上时才会发生这种情况)。检查该队列,您应该在其中看到您的消息。这意味着您在代码中错误地处理了队列。

尝试此操作:创建一个专用队列,并使用格式FORMATNAME:DIRECT=OS:<server name>\PRIVATE$\<queue name>对其进行寻址。从您的问题来看,听起来您真的不需要使用公共队列。

此外,不要费心检查队列是否存在,除非您打算在不存在时进行处理(例如通过引发异常或以编程方式创建它)。