2009-04-21 43 views
12

在計劃的時間間隔內,我需要調用WCF服務以異步方式調用另一個WCF服務。調度對WCF服務的調用我已經制定出來了。需要採樣並忘記WCF服務的異步調用

我認爲我需要什麼,我已經在這裏閱讀了關於stackoverflow,它是必要的,(實質上)準備或更改您的WCF服務的代碼,以便能夠處理一個異步調用給他們。如果是這樣的話,一個簡單的例子會是什麼樣子?(也許前後的例子)在.Net 3.5中,它是否仍然是必需的?

其次,我使用WCF服務中的代理完成對下一個WCF服務的調用,並且需要對WCF服務進行異步調用的示例,如果它與BeginEnvoke和EndEnvoke中典型的異步例子。

如果我完全不瞭解我的問題,我會相信它,並希望通過更正來建立更好的問題。

+0

包含併發管理示例的[IDesign.net](http://idesign.net/idesign/DesktopDefault.aspx?tabindex=5&tabid=11#ConcurrencyManagement)上的大量示例。 – 2009-04-21 21:34:17

回答

22

在要調用的WCF方法上,將OperationContract屬性的IsOneWay屬性設置爲true。這告訴WCF該調用只對一個方向很重要,並且客戶端不會爲了完成執行而停下來。

即使在調用BeginInvoke時,客戶端代碼仍然會等待服務器方法完成執行,但它會在線程池線程上執行。

[ServiceContract] 
interface IWCFContract 
{ 
    [OperationContract(IsOneWay = true)] 
    void CallMe() 
} 

另一種做你想做的事的方法是讓WCF服務把它的工作轉到後臺線程並立即返回。

+0

在服務收到消息(方法調用)之前,客戶端仍然可以被阻塞。取決於服務的併發定義和/或傳輸會話的存在。 – Menahem 2017-12-11 14:32:11

7

請務必仔細測試OneWay WCF呼叫的執行方式。我看到它在到達X個併發呼叫時停頓,就好像WCF實際上等待呼叫結束一樣。

更安全的解決方案是讓「目標」代碼儘快返回控制:不要讓它完全處理調用,而只是將數據放入隊列並返回。讓另一個線程輪詢該隊列並異步處理數據。

並確保應用線程安全機制以避免在該隊列上工作的兩個線程之間發生衝突。

0

不要使用BeginInvoke或甚至線程爲您的模式。請確保您使用AsyncPattern根據Microsoft網站裝飾您的類,否則您的Async委託和線程將以同步模式運行。 WCF強制這種行爲。這個信息是由另一個op發佈的,他發現了一個解決方案來阻止堆棧上的回調問題..對不起,但我不記得鏈接。