Un servicio asincrónico que usa async-await es muy sensible ya que puede intercalar muchas llamadas de cliente y ejecutarlas en paralelo (2). A pesar de esto, el servicio puede ejecutarse completamente seguro para subprocesos en un subproceso (3) y puede ser un servicio singleton (1) o un objeto de servicio creado por el marco para una sesión o una llamada solamente.
Al implementar el servicio, tenga en cuenta los ServiceBehaviourAttributes (1) ... (3):
[ServiceContract(Namespace="X", Name="TheContract")]
public interface IAsyncContractForClientAndService
{
[OperationContract]
Task<TResponse> SendReceiveAsync(TRequest req);
}
[ServiceBehavior (InstanceContextMode = InstanceContextMode.Single, // (1)
// also works with InstanceContextMode.PerSession or PerCall
ConcurrencyMode = ConcurrencyMode.Multiple, // (2)
UseSynchronizationContext = true)] // (3)
public MyService : IAsyncContractForClientAndService
{
public async Task<TResponse> SendReceiveAsync(TRequest req)
{
DoSomethingSynchronous();
await SomethingAsynchronous();
// await lets other clients call the service here or at any await in
// subfunctions. Calls from clients execute 'interleaved'.
return new TResponse(...);
}
}
Para ejecutar todas las llamadas en un hilo, un System.Threading.SynchronizationContext.Current = null debe! estar presente en el momento en que abra() el ServiceHost. Usando SynchronizationContext, no necesita preocuparse por los bloqueos. Las secciones de código atómicas no interrumpibles se extienden aproximadamente de una en espera a la siguiente. Tenga cuidado de que los datos de servicios compartidos estén en un estado constante en cada estado de alerta y tenga en cuenta que las solicitudes sucesivas de un cliente pueden responderse no en el orden en que se enviaron.
En el lado del cliente, la operación del servicio asíncrono es awaitable:
var response = await client.Channel.SendReceiveAsync(request);
No es posible utilizar fuera o ref parámetros en el contrato de operación. Todos los datos de respuesta deben pasar por el valor devuelto Tarea (T).
Uso esta interfaz en AsyncWcfLib, es compatible con Actor based programming model.
Corr. +1 simplemente por presentarme algo brillante y nuevo. – spender