System.Messaging – 为什么MessageQueue不提供异步版本的Send

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

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

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

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

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

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

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

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

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