2011-05-11 41 views
0

我有一個Windows服務託管一個單獨的WCF服務,緩存大量的數據。在窗口服務的啓動時我做了以下內容:WCF「火與遺忘」方法不允許主機執行按預期繼續

// start client service 
     wcfService= new ServiceHost(typeof(MyWcfService)); 
     wcfService.Open(); 

     using (HostedServiceReference.WcfServiceProxy wcfServiceProxy = new HostedServiceReference.WcfClientServiceProxy()) 
     { 
      wcfServiceProxy.RefreshDisplayCacheFromSource(); 
      // 1st echo to console 
      Console.WriteLine("Display Cache Refreshed")); 
     } 
     // 2nd echo to console 
     Console.WriteLine("Begin other processing")) 

,我已經配置了一種方法,在服務合同如下:

[OperationContract(IsOneWay=true)] 
    void RefreshDisplayCacheFromSource(); 

我早就預料到立即看到第一和第二回聲顯示在控制檯中,但我實際看到的僅僅是第一個回聲。第二行不會顯示,直到我的「隨手忘記」方法完成了長時間的操作。

任何人都可以解釋在後臺發生了什麼?

我的理論迄今:

是在單模式下的WCF服務阻斷收留了它的服務的運作?

這是使用using語句嗎?

+0

可能與本文中提到的某些事情有關:[「鏈接](http://stackoverflow.com/questions/2176018/wcf-asyncpattern-true-or-isoneway-true)_」IsOneWay會鎖定你的線程。唯一的區別是它不等待整個操作在服務器端完成,它等到服務器端確認它收到了整個消息「_ – Franchesca 2011-05-11 14:18:15

回答

1

WCF服務的代理對象將在使用塊的末尾處置,但在客戶端收到服務收到其消息的確認之後纔會發生。似乎該服務在執行方法體中的所有代碼(包括處理大量數據)之前不會發送確認,因此客戶端的執行將在使用塊的末尾等待,直到服務完成處理。

有2種方式,我能夠使用來解決這個問題:

讓代理對象在客戶端的全局變量。

關閉服務器中的線程以處理長時間處理,允許服務器方法立即返回客戶端正在等待的確認。

0

如果您的目標是在WCF調用完成時繼續進行其他工作,請右鍵單擊您的服務參考並點擊「更新服務參考」。檢查選項以生成異步方法。

然後將其稱爲wcfServiceProxy.RefreshDisplayCacheFromSourceAsync();

如果您希望在完成時收到通知,您也可以爲其添加事件處理程序。

+0

在這種情況下,問題在於代理對象在使用塊。底層通道的實際關閉會阻塞,直到服務完成(發送確認)。只是改變呼叫async不會解決問題。 – Franchesca 2011-05-23 14:38:22