Как ждать завершения Задачи в операции службы WCF

1

Приносим извинения, если раньше был задан вариант этого вопроса, но я изо всех сил пытаюсь найти ответ, который относится к моей нынешней ситуации.

Я работаю над проектом, в котором меня попросили разоблачить операции поставщика, основанного на задачах, через службу WCF. Интерфейс провайдера явно определяет Task<T> как возвращаемый тип каждого метода, вот пример:

public interface IContactProvider
{
    Task<IEnumerable<Contact>> GetAllContacts(); 
}

В попытке разоблачить это как службу WCF, я в основном определил "синхронную" версию интерфейса поставщика для использования в качестве контракта на обслуживание, в результате чего реализована реализация службы, которая выглядит так:

public class ContactService : IContactService
{
    private IContactProvider contactProvider;

    public IEnumerable<Contact> GetAllContacts()
    {
        return contactProvider.GetAllContacts().Result;
    }
}

Мой инстинкт говорит мне, что я делаю что-то неправильно здесь и что я должен "ждать", чтобы Result был доступен другим способом. Есть лучший способ сделать это?

Теги:
asynchronous
wcf

1 ответ

2
Лучший ответ

То, что вы делаете, должно работать нормально (Result будет заблокирован до завершения задачи), но используете ли вы.NET 4.5? Если это так, вы можете просто объявить свой контракт на обслуживание, чтобы напрямую вернуть async Task<T>. Таким образом, ваши клиенты автоматически получат возможность вызывать его синхронно или асинхронно (через сгенерированный клиент службы).

Здесь сообщение, которое я нашел более полезным, чем документы MSDN: http://blog.vuscode.com/malovicn/archive/2012/01/21/what-is-new-in-wcf-in-net-4-5- taskt-и-async.aspx

  • 0
    Я предполагаю факт, что блоки Result - то, о чем я волновался. Я не хочу создавать сценарий, когда служба блокируется, но, может быть, это здесь невозможно? Кроме того, я использую .NET 4.5, но я не могу гарантировать, что другие клиенты будут .NET (или .NET 4.5 в этом отношении); будет ли использование Задачи <T> в контракте на обслуживание причиной проблем для этих клиентов?
  • 2
    @sellmeadog Не следует повторно использовать один и тот же интерфейс для клиентских и серверных контрактов. Интерфейс на стороне сервера может быть Task<IEnumerable<Contact>> GetAllContactsAsync(); и интерфейс на стороне клиента может быть IEnumerable<Contact> GetAllContacts() и он будет "просто работать" с WCF. WCF автоматически предоставляет клиенту синхронизированную и асинхронную версию каждого метода, но серверу нужно только реализовать одно из двух.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню