2013-08-18 8 views
2

Я хотел бы воспользоваться новыми задачами для работы с WCF-клиентом. В настоящее время я использую WCFFacility следующим образом:Использование операций на стороне клиента с использованием WCFFacility в Castle.Windsor

container.Register(Component 
    .For<IAdminService>() 
    .LifeStyle.Transient 
    .AsWcfClient(new DefaultClientModel() 
    { 
     Endpoint = WCFHelpers.BasicHttp(settings.MaxReceivedMessageSize) 
      .At(addr) 
    })); 

где IAdminService - это класс ServiceContract. Все статьи MSDN о задачах, основанных на задачах, относятся к установке галочки «задачи на основе операций» при импорте служебной ссылки. Но в том стиле, который я использую в настоящее время, нет ссылки на импортированную службу, потому что я просто обращаюсь непосредственно к интерфейсу контракта на обслуживание.

Так что мне интересно, как я могу включить поддержку операций с задачами с минимальным количеством изменений текущего кода.

[BTW - WCFHelpers это утилита класс, который генерирует BindEndpointModel и адр настроен на соответствующий адрес конечной точки до этого кода выполняются]

+0

Вы пробовали изменять методы '' IAdminService' к Task' возвращающих тем ? Я думаю, что это должно сработать. – svick

+0

Я получил новый интерфейс для добавления методов возврата задачи. Он работает только наполовину: вызов делает его сервером, но, похоже, задача на клиенте никогда не завершается - это в конечном итоге истекает. Я не могу найти решение – Schneider

ответ

2

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()); 
+1

не ждут в клиентских расширениях, просто верните Задачу, созданную с Factory, тогда потребитель будет ждать, ждать или продолжать с другой задачей или независимо от того, что это необходимо от вызывающего. Проверьте здесь, в разделе «От APM до TAP» http://msdn.microsoft.com/en-us/library/hh873178(v=vs.110).aspx –

 Смежные вопросы

  • Нет связанных вопросов^_^