2014-02-18 27 views
7

我正在使用的項目是在服務器端使用WCF服務(代碼位於同一項目中)。我想通過編寫一個使用該服務的PCL來擴展它,並希望使用Async/Await模式實現調用。異步/等待PCL中的WCF客戶端

由於PCL從一開始就不支持Async/Await,我通過Nuget將BCL.Async包添加到項目中。但是每當我嘗試生成代理時,基於任務的異步客戶端都不能被選擇,即生成。通過ChannelFactory手動添加代理在PCL中似乎也不可能。

我目前的方法是生成複製ref類的代理,然後使用TPL提供的任務包裝自己編寫async/await模式。但有沒有更簡單的方法?如何直接使用異步/等待模式手動編寫包裝器,而不會生成具有相同效果的多個異步模式?

+1

不要使用TPL /'Task.Run'來「包裝」你的WCF調用。你不是在做真正的無線異步操作,假設你實際上在嵌入式設備上工作,這將會產生巨大的影響。但是,您可以使用'Task.Factory.FromAsync(BeginXXX,EndXXX)'方法......這樣可以正常工作。 – Aron

+0

@Aron,感謝您的輸入。 TPL鏈接實際上符合你提到的方法,所以我想這將是正確的路徑,除了我可以以某種方式寫/生成基於wcf客戶端的任務。 – Mark

+0

我知道有兩種方法。首先,爲您的接口使用直接引用(與WSDL相對)(我建議,當您的客戶端和服務器從相同的回購開發時)。其次,是使用'partial'關鍵字手動添加異步方法。 – Aron

回答

3

最後,我生成的代理並手動包裹所生成的APM模型與TaskFactory以在PCL內的客戶端的異步/等待模式。我在這裏寫下了這個blog post

編輯:更新斷開的鏈接。

+1

您的鏈接已損壞:( –

+0

@SergeyMetlov對不起,很久以前,但鏈接再次工作... – Mark

0

您是否嘗試過使用/ async參數與svcUtil.exe工具?

詳見這裏ServiceModel Metadata Utility Tool (Svcutil.exe)

+0

*不要*使用/ async參數。它用於生成舊式的APM方法。 .NET 4.5自帶的scvutil版本默認生成任務方法 –

+0

@PanagiotisKanavos,我沒有測試過這個方法,我基於上面指向.NET 4.5文檔的文檔。這是一個新事物,因爲文檔說默認是相反的。 – Oakcool

+0

這不是一個新事物,它是如何工作的。文檔不清楚,甚至沒有包含所有參數。命令行幫助指出:_「生成同步和開始/結束異步方法簽名。默認:生成同步和基於任務的異步方法簽名。」_甚至還有一個/ syncOnly開關,用於防止生成任何類型的異步代碼 –