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」を呼び出しているときに、そのメソッド内でServiceメソッドfooが呼び出されると、サービスがフリーズします。fooを非同期で呼び出すと正常に機能しますが、呼び出しを同期する必要があります。

4

1 に答える 1

1

問題は、値を返すためにDoCommandが必要であるため、OneWayにすることができないことだと思います。あなたがこれについて考えるならば、これはあなたのサービスをブロックしなければなりません。

ServiceBehaviorのConcurrencyModeをMultipleに設定できます。これは機能するはずですが、私見では最適なオプションではありません。

双方向のコミュニケーションがあるので、OneWay-Methodsに固執してみてください。これにより、問題が解決され、上記の動作での困難な同時発生の問題を防ぐことができます。

于 2011-09-05T06:34:44.690 に答える