wcf双工服务在回叫呼叫时冻结

时间:2011-09-05 06:23:21

标签: c# .net wcf servicehost

服务合同:

[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'时,在该方法内部调用了一个Service方法foo,我的服务冻结了。 如果我异步调用foo它工作正常,但我需要调用同步。

1 个答案:

答案 0 :(得分:1)

我认为问题是你需要DoCommand返回一个值,因此无法使其成为OneWay。如果您考虑到这一点,就必须阻止您的服务。

您可以将ServiceBehavior的ConcurrencyMode设置为多个,这应该可行,但恕我直言,这不是最佳选择。

由于您正在进行双向沟通,请尝试坚持使用OneWay-Methods - 这样可以解决问题并防止出现上述行为导致的难以解决的问题。