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

dar*_*key 5 c# msmq async-await

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

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

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

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

Ste*_*ary 10

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

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