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