Использование клиентских операций на основе задач с WCFFacility в Castle.Windsor
Я хотел бы воспользоваться преимуществами новых операций на основе задач для клиента WCF. В настоящее время я использую WCFFacility следующим образом:
container.Register(Component
.For<IAdminService>()
.LifeStyle.Transient
.AsWcfClient(new DefaultClientModel()
{
Endpoint = WCFHelpers.BasicHttp(settings.MaxReceivedMessageSize)
.At(addr)
}));
где IAdminService - это класс ServiceContract. Все статьи MSDN об операциях на основе задач относятся к установке флажка "Операции на основе задач" при импорте ссылки на сервис. Но в стиле, который я сейчас использую, нет импортированной ссылки на сервис, потому что я просто ссылаюсь непосредственно на интерфейс контракта на сервис.
Поэтому мне интересно, как я могу включить поддержку операций на основе задач с наименьшим количеством изменений в текущем коде.
[BTW - WCFHelpers - это служебный класс, который генерирует BindEndpointModel, и для addr устанавливается соответствующий адрес конечной точки до выполнения этого кода]
1 ответ
WCFFacility предоставляет некоторые методы расширения, которые соответствуют старому асинхронному шаблону. Они могут быть легко преобразованы в задачи.
Попробуйте эти методы расширения:
public static class ClientExtensions
{
public static async Task<TResult> CallAsync<TProxy, TResult>(this TProxy proxy, Func<TProxy, TResult> method)
{
return await Task.Factory.FromAsync(proxy.BeginWcfCall(method), ar => proxy.EndWcfCall<TResult>(ar));
}
public static async Task CallAsync<TProxy>(this TProxy proxy, Action<TProxy> method)
{
await Task.Factory.FromAsync(proxy.BeginWcfCall(method), ar => proxy.EndWcfCall(ar));
}
}
В асинхронном методе их можно вызвать так:
// Func<T>
var result = await client.CallAsync(p => p.SayThisNumber(42));
// Action
await client.CallAsync(p => p.DoSomething());