2013-11-02 22 views
4

有誰知道爲什麼System.Messaging沒有提供Send方法的異步版本來發送MSMQ消息到隊列。System.Messaging - 爲什麼MessageQueue不提供發送異步版本

實際上,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不提供將消息發送到隊列的異步方式?

回答

9

MSMQ documentation指出發送「始終是異步操作」。自從我開始使用MSMQ以來,一直以來都是這樣,但是一旦您發送了IIRC,消息就會在本地刷新到磁盤,甚至會嘗試通過網絡發送。

所以,雖然它不是真正的異步(它必須等待磁盤寫入),但它應該相當快。

+0

感謝您指出文檔併爲您的評論Stephen提供意見。順便說一句我已經發布了一個後續相關的問題在這裏.. http://stackoverflow.com/questions/19748129/cpu-underutilized-due-to-blocking-i-o;) – darkey

0

你是對的,MessageQueue.Send是一個阻塞呼叫。它執行本地IO,但MSMQ仍然會進入磁盤並等待結果。在調用任何MessageQueue.Send重載之前,請致電Task.Yield。當您進行大量發送時,這會提高速度。

如果您的代碼庫是異步/等待並且您沒有在任何地方使用線程,這將會產生很大的差異。

相關問題