MSMQ专用队列 - 不接收

时间:2010-09-06 18:25:49

标签: c# msmq console-application

MSMQ新手...我的本地队列永远不会收到我的测试消息。我已经验证消息队列和消息队列触发器正在我的服务对话框(Vista Ultimate)中运行。想法?

class ConsoleApplication
{
    private const string Path = @".\private$\SomeQueue";

    static void Main(string[] args)
    {
        var queue = !MessageQueue.Exists(Path) 
         ? MessageQueue.Create(Path) 
         : new MessageQueue(Path) { Formatter = new BinaryMessageFormatter() };

        queue.ReceiveCompleted += queue_ReceiveCompleted;
        queue.BeginReceive();
        queue.Send("test message");
        Console.ReadLine();
        queue.Close();
    }

    static void queue_ReceiveCompleted(object sender, 
                                        ReceiveCompletedEventArgs e)
    {
        Console.WriteLine("Received message...");
        var queue = (MessageQueue)sender;
        try
        {
            var message = queue.EndReceive(e.AsyncResult);
            Console.WriteLine("Processing message...");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
            queue.BeginReceive();
        }
    }
}

编辑:刚想了一下,尝试使用MessageQueue.Delete(Path)删除并重新创建队列。它奏效了。我想我的队列不知何故被淹没了。

3 个答案:

答案 0 :(得分:2)

尝试添加

queue.ReceiveCompleted += queue_ReceiveCompleted;

static void queue_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)事件的最后一个块中。

答案 1 :(得分:1)

我怀疑队列本身是否已被破坏。 更有可能是创建队列和访问队列之间的时间问题。 MSMQ必须执行各种操作,例如在专用队列可用之前在LQS目录中创建配置文件。

答案 2 :(得分:0)

您无法同时访问控制台。尝试执行thread.Sleep()并在回调中设置一个布尔值。然后,在布尔值设置为读取输出后,您可以执行readline。

while (!received)
{
    System.Threading.Thread.Sleep(1000);
}
Console.ReadLine();

也许你可能想要使用断点和debug.WriteLine()来读取写入visual studio输出窗口的输出。