2011-09-05 62 views
1

服務合同:WCF雙工服務回撥電話凍結

[ServiceContract(CallbackContract = typeof(IClientCallBackChannel), 
SessionMode = SessionMode.Required)] 
public interface IServerService 
{ 
    [OperationContract(IsOneWay = true)] 
     void foo(); 
} 

客戶合同:

public interface IClientCallBackChannel 
{ 
    [OperationContract(IsOneWay = false)] 
    object DoCommand(Command command); 
} 


class ClientCallBackChannelImpl 
{ 
    public object DoCommand(Command command) 
    { 
     // freezes service 
     serverService.foo(); 

     // OK 
     new Action(() => 
     { 
      Thread.Sleep(1000);       
      serverService.foo();           
     } 
      ).BeginInvoke(null,null); 

    }    
} 

我有一個雙工服務,當我打電話,一個客戶端的方法「DoCommand」這個方法裏面有一個調用服務方法富,我的服務凍結。 如果我異步調用foo,它工作正常,但我需要調用是同步的。

回答

1

我認爲問題是你需要DoCommand來返回一個值,所以不能使它成爲OneWay。如果你考慮到這一點,這必須阻止你的服務。

您可以將您的ServiceBehavior的ConcurrencyMode設置爲多個,這應該工作,但恕我直言,這不是最好的選擇。

由於您有雙向溝通,請嘗試堅持使用OneWay-Methods - 這將解決問題並防止您遇到上述行爲帶來的難以解決的問題。

+0

我嘗試將我的ServiceBehavior的併發模式設置爲多個,但仍然阻塞。 – jacob

+0

都在你的服務和客戶端?奇怪 - 無論如何,如果你想在另一箇中調用一個,只能嘗試重構成OneWay方法。 – Carsten

+0

還有一件事:我只看到一半你的代碼 - 確保你不再在foo內調用DoCommand - 也許你在這裏得到了一些無限循環... – Carsten