【问题标题】:listen to message queue [duplicate]收听消息队列[重复]
【发布时间】:2017-12-09 07:00:23
【问题描述】:

我正在尝试创建一个控制台应用程序来侦听本地计算机上的消息队列。这是我到目前为止的代码..

static void Main(string[] args)
    {
        var _queue = new MessageQueue(@".\private$\testing");
        _queue.Formatter = new XmlMessageFormatter(new Type[] { 
       typeof(string) });

        _queue.ReceiveCompleted += new 
       ReceiveCompletedEventHandler(queue_ReceiveCompleted);
        _queue.BeginReceive();

    }
  private static void queue_ReceiveCompleted(object source, 
         ReceiveCompletedEventArgs e)
    {
        MessageQueue mq = (MessageQueue)source;
        Message msg = mq.EndReceive(e.AsyncResult);
        Console.WriteLine(msg.Body.ToString());
        mq.BeginReceive();
    }

我的问题是这样的..首先程序退出

        Console.WriteLine(msg.Body.ToString());

我没有收到队列中的其他消息。

所以我尝试不使用 Console.WriteLine 来查看是否从队列中读取了所有消息

private static void queue_ReceiveCompleted(object source, 
         ReceiveCompletedEventArgs e)
    {
        MessageQueue mq = (MessageQueue)source;
        Message msg = mq.EndReceive(e.AsyncResult);
        mq.BeginReceive();
    }

但结果有时不一致,有时会读取 1 条消息,有时会读取 4 条消息,有时会读取全部消息。

那是怎么回事,我做错了吗?

【问题讨论】:

  • @Servy 我认为这不是重复的,这不是同一个问题。
  • @Jimbot 这是重复的,因为它是同一个问题。

标签: c# msmq


【解决方案1】:

BeginReceive方法是asynchronous,所以不会阻止main()退出。

您可以做的就是在main() 的末尾添加一个Console.ReadKey(); 以防止这种情况发生,直到用户进行交互。

【讨论】:

  • 谢谢!你拯救了这一天
猜你喜欢
  • 2012-01-19
  • 1970-01-01
  • 2010-09-19
  • 2012-11-16
  • 2013-12-06
  • 2011-07-10
  • 2011-07-15
  • 2011-06-14
  • 2013-10-17
相关资源
最近更新 更多