5

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

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

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

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

4

2 回答 2

10

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

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

于 2013-11-02T21:38:14.823 回答
1

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

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

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

于 2017-07-31T20:37:51.407 回答