Использование клиентских операций на основе задач с 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());
Другие вопросы по тегам