c# - 监听消息队列

标签 c# msmq

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

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 条消息,有时会读取全部消息。

所以这是怎么回事,我做错了什么吗?

最佳答案

BeginReceive 方法是 asynchronous ,因此它不会阻止 main() 退出。

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

关于c# - 监听消息队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44929101/

相关文章:

msmq - 使用 rebus 和 MSMQ 取消挂起作业或执行作业的最佳策略是什么? (长时间运行)

c# - 没有端点在本地主机上监听

c# - 使用 msmq 队列对服务进行负载平衡?

c# - 如何防止 WCF 服务进入故障状态?

c# - 在 get 中返回值和分配属性有什么区别?

c# - 使用 msmq 和 wcf

c# - 从 MSMQ 读取时无法反序列化 Message.Body

c# - 将 Open XML Excel 文件转换为 HTML

c# - 从 M 集合中取出 n 个唯一对象

c# - 如何从数据表中获取最高值?