Использование клиентских задач на основе операций с 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 устанавливается на соответствующий адрес конечной точки до выполнения этого кода]


person Terry Coatta    schedule 18.08.2013    source источник
comment
Вы пробовали изменить методы в IAdminService на Task возвращающие? Я думаю, это должно сработать.   -  person svick    schedule 19.08.2013
comment
Я создал новый интерфейс для добавления методов, возвращающих задачи. Это работает только наполовину: вызов поступает на сервер, но кажется, что задача на клиенте никогда не завершается - в конечном итоге время ожидания истекает. Я не могу найти решение   -  person Jack Ukleja    schedule 16.10.2013


Ответы (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());
person Phil Degenhardt    schedule 05.01.2014
comment
не ждите в клиентских расширениях, просто верните задачу, созданную из Factory, тогда потребитель будет ждать, ждать или продолжать выполнение другой задачи или того, что требуется от вызывающего. Проверьте здесь раздел От APM к TAP msdn. microsoft.com/en-us/library/hh873178(v=vs.110).aspx - person Michael Denny; 02.06.2014