如何创建c#程序发送到本地消息队列
本文关键字:队列 消息 程序 何创建 创建 | 更新日期: 2023-09-27 18:09:36
我有一个c#程序,试图发送到我自己的本地Windows消息队列。我已经安装了消息队列,出于绝望,我给了"每个人"在消息队列本身和我试图写的公共队列上的所有访问权。我有一个表单,其中有两个文本框和两个按钮。一双用于发送,另一双用于接收。我点击发送,没有错误,它可以检测到实际上有一个该名称的消息队列。但是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)
{
}
}
}
调用MessageQueue.Send()
方法时,检查消息队列中的Outgoing Queues文件夹。您应该看到已经设置了一个临时队列(注意,只有当目标队列位于发送机器的另一台机器上时才会出现这种情况)。检查该队列,您应该会在其中看到您的消息。这意味着您在代码中错误地处理了队列。
试试这个:创建一个私有队列,并使用FORMATNAME:DIRECT=OS:<server name>'PRIVATE$'<queue name>
格式给它寻址。从你的问题听起来你真的不需要使用公共队列。
另外,不要检查队列是否存在,除非您打算在队列不存在时进行处理(例如通过引发异常或以编程方式创建异常)。