Асинхронный сервис, использующий async-await, очень отзывчив, поскольку он может чередовать многие клиентские вызовы и выполнять их параллельно (2).Несмотря на это, служба может быть полностью поточно-ориентированной в одном потоке (3) и может быть одноэтапной службой (1) или объектом службы, созданным средой для сеанса или только для вызова.
При реализацииОбратите внимание, что 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( ... );
}
}
Для выполнения каждого вызова в одном потоке System.Threading.SynchronizationContext.Current! = null должен присутствовать вВ тот момент, когда вы открываете () ServiceHost.Используя SynchronizationContext, вам не нужно заботиться о блокировках.Атомарные, не прерываемые фрагменты кода растягиваются примерно от одного ожидания к другому.Позаботьтесь о том, чтобы данные общего сервиса находились в согласованном состоянии при каждом ожидании, и имейте в виду, что последовательные запросы от одного клиента могут отвечать не в том порядке, в котором они были отправлены.
На стороне клиента асинхронная операция сервиса является ожидаемой:
var response = await client.Channel.SendReceiveAsync( request );
Невозможно использовать параметры out или ref в договоре на эксплуатацию.Все данные ответа должны передаваться возвращаемым значением Task (T).
Я использую этот интерфейс в AsyncWcfLib , он поддерживает Модель программирования на основе актера .