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

如何创建发送到本地消息队列的C#程序。,c#,msmq,C#,Msmq,我有一个C#程序正试图发送到我自己的本地Windows消息队列。我已经安装了消息队列,出于绝望,我在消息队列本身和我试图写入的公共队列上为“所有人”授予了所有访问权限。我有一个表单,它有两个文本框和两个按钮。一对用于发送,另一对用于接收。我单击send并没有错误,它可以检测到实际上有一个同名的消息队列。但是send方法似乎没有真正进入队列就停止了。谢谢你的帮助!代码如下: using System; using System.Collections.Generic; using System.C

我有一个C#程序正试图发送到我自己的本地Windows消息队列。我已经安装了消息队列,出于绝望,我在消息队列本身和我试图写入的公共队列上为“所有人”授予了所有访问权限。我有一个表单,它有两个文本框和两个按钮。一对用于发送,另一对用于接收。我单击send并没有错误,它可以检测到实际上有一个同名的消息队列。但是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)
    {

    }





    }
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Windows.Forms;
使用系统消息传递;
命名空间Windows窗体应用程序1
{
公共部分类Form1:Form
{
公共消息队列myNewPublicQueue;
私有静态对象lockObject=新对象();
/// 
/// 
/// 
公共表格1()
{
初始化组件();
}
/// 
/// 
/// 
/// 
/// 
私有无效按钮发送\单击(对象发送者,事件参数e)
{
if(MessageQueue.Exists(@“\queuename”))
{
myNewPublicQueue=newSystem.Messaging.MessageQueue(@“\queuename”);
System.Messaging.Message mm=新的System.Messaging.Message();
mm.Body=textBoxSend.Text;
mm.Label=“第一条测试消息”;
myNewPublicQueue.Send(mm);
}
}
私有无效按钮点击(对象发送者,事件参数)
{
myNewPublicQueue.ReceiveCompleted+=新的ReceiveCompletedEventHandler(队列\ U ReceiveCompleted);
//开始听。
myNewPublicQueue.BeginReceive();
}
私有无效队列\u ReceiveCompleted(对象发送方,ReceiveCompletedEventArgs e)
{
锁定(锁定对象)
{
//消息是纯文本的。
string text=(string)e.Message.Body;
Console.WriteLine(“收到的消息:+文本”);
Text=Text;
}
//收听下一条消息。
myNewPublicQueue.BeginReceive();
}
公共枚举消息类型
{
消息类型纯文本=0,
消息类型你好世界=1
};
私有void Form1\u加载(对象发送方、事件参数e)
{
}
}
}

调用
MessageQueue.Send()方法时,请检查Message queue中的outing Queues文件夹。您应该看到已经设置了一个临时队列(注意,只有当目标队列位于发送机器的另一台机器上时,才会发生这种情况)。检查该队列,您应该会在其中看到您的消息。这意味着您在代码中对队列的寻址不正确

尝试以下操作:创建一个专用队列,并使用以下格式对其进行寻址:
FORMATNAME:DIRECT=OS:\private$\
。从你的问题来看,听起来你真的不需要使用公共队列


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

您的代码是这样的:如果队列不存在,发送将不执行任何操作。是否已在调试器中逐步完成代码?发送到本地队列不会生成传出队列。MSMQ只是简单地将消息移动到队列中。是的,结果是私密的。查找了更多有关差异的信息,发现公共队列是由active directory类型的计算机设置的。谢谢