2015-10-06 40 views
1

,我發現這個文件,說明如何實現異步WCF服務操作:爲什麼實現異步WCF服務操作

https://msdn.microsoft.com/en-us/library/ms731177(v=vs.110).aspx

這使我想知道爲什麼(或當)我會想我的服務操作是異步的,當客戶端可以自己生成操作的異步版本。當客戶端生成操作的異步版本時,它是否與服務已經實現了異步操作本身一樣?

另外,在文檔的示例代碼中,沒有針對最終方法的OperationContractAttribute。爲什麼?

+0

這也讓我感到困惑。似乎每個人都在等待Aync等待狂妄,但如果服務器已經在處理請求,他們進來後,我們不能得到很大的效率提升,我們感到很頭疼。看起來好像你有一臺擁有大量處理能力的服務器,你可以處理更多的負載。這是唯一的原因嗎? –

+1

我認爲當客戶端生成異步版本的操作時,它仍然在服務器上同步運行。正確? – Darius

+0

是的,每個請求是,正確。所以如果我說DoThing1,DoThing2,DoThing3,那麼每個都不是異步請求?看起來你得到的唯一好處是CPU可以在每個請求中發生的操作之間跳舞,而不管請求者使用一堆CPU。我真的很想知道我是否在這裏錯過了一些東西。似乎像Twitter或超高流量的東西將是唯一一個在這裏看到任何好處。 –

回答

4

我認爲你的問題的答案是在你提供的鏈接之後。 這裏(https://msdn.microsoft.com/en-us/library/ms734701%28v=vs.110%29.aspx),你可以看到:

如果操作服務實現,使阻塞調用,使用在服務操作實現異步方法,如執行I/O的工作。當您處於異步操作實現中時,嘗試調用異步操作和方法以儘可能擴展異步調用路徑。例如,在BeginOperationOne()中調用BeginOperationTwo()。

因此,當您的服務使用另一個服務(例如Redis)或下載任何內容時,這對於以異步方式實現這些操作也絕對有意義,而不是阻止服務器的工作線程。工作線程的數量是有限的,並且在某些時候你的服務器會卡住,因爲它們都在服務調用。在異步實現的情況下,您可以利用I/O完成端口和獨立線程池中適當的I/O線程。在Windows中,I/O completion ports是非常高效的機制,這有助於避免資源浪費。