【问题标题】:System.Messaging - why MessageQueue does not offer an asynchronous version of SendSystem.Messaging - 为什么 MessageQueue 不提供异步版本的 Send
【发布时间】:2023-03-14 12:45:02
【问题描述】:

有谁知道为什么 System.Messaging 不提供异步版本的 Send 方法来将 MSMQ 消息发送到队列。

实际上有异步版本的 Peek 和 Receive 方法(通过 Begin/End 对,可以转换为 C#5 异步等待方法),但令人惊讶的是,没有提供 BeginSend/EndSend 方法,只是一个看起来的 Send 方法对我来说,这是一个同步阻塞 I/O 调用。

我认为这不是 System.Messaging 的限制,而是 System.Messaging 使用的本机消息队列 API (mqrt.dll) 之一,它采用重叠结构作为函数 MQReceiveMessage 中的参数来使用重叠带 IOCP 的 I/O,而函数 MQsendMessage 没有采用这种结构,所以看起来它是一个纯粹的同步调用。

我的问题仍然存在,任何人都会知道为什么 MessageQueue API 不提供将消息发送到队列的异步方式?

【问题讨论】:

    标签: c# async-await msmq


    【解决方案1】:

    你是对的,MessageQueue.Send 是一个阻塞调用。它执行本地 IO,但 MSMQ 仍会写入磁盘并等待结果。

    在调用任何MessageQueue.Send 重载之前调用Task.Yield。当您进行大量发送时,这将提高速度。

    如果您的代码库是 async/await 并且您没有在任何地方使用线程,这将产生很大的不同。

    【讨论】:

      【解决方案2】:

      MSMQ documentation 声明发送“始终是异步操作”。自从我使用 MSMQ 以来已经有一段时间了,但是一旦您发送 IIRC,消息就会在本地刷新到本地磁盘,然后再尝试通过网络发送。

      所以,虽然它不是真正异步的(它必须等待磁盘写入),但它应该相当快。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 2016-08-20
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      相关资源
      最近更新 更多