1

服务合同:

[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,我的服务冻结了。如果我异步调用 foo 它工作正常,但我需要调用是同步的。

4

1 回答 1

1

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

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

由于您有双向通信,请尝试坚持使用 OneWay-Methods - 这将解决问题并防止您遇到上述行为的困难并发问题。

于 2011-09-05T06:34:44.690 回答