Pregunta

Contrato de servicios:

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

Contrato del cliente:

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);

     }            
}

Tengo un servicio dúplex y cuando llamo a un método de cliente 'Docommand' que dentro de ese método hay una llamada a un método de servicio Foo, mi servicio se congela. Si llamo a Foo asíncrono, funciona bien, pero necesito que la llamada sea sincrónica.

¿Fue útil?

Solución

Creo que el problema es que necesita que el Docommand devuelva un valor y, por lo tanto, no pueda hacerlo un solo camino. Si piensa en esto, esto tiene que bloquear su servicio.

Puedes configurar el Concurrencia moderada de su servicio de servicio a múltiples y esto debería funcionar, pero en mi humilde opinión no es la mejor opción.

Como tiene una comunicación bidireccional, intente seguir con los métodos de una vía, esto resolverá el problema y le impedirá problemas de concurencia difíciles con el comportamiento mencionado anteriormente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top