Существует ли эта идиома TPL? - PullRequest
5 голосов
/ 24 января 2012

Используя TPL с .NET 4, я пытаюсь решить, как создавать API, которые работают с фьючерсами.Одна возможность, которая пришла мне в голову, состояла в том, чтобы имитировать асинхронный шаблон, но без метода End(IAsyncResult):

public Task<int> BeginGetAge()
{
    // create and return task
}

public int GetAge()
{
    return this.BeginGetAge().Result;
}

Таким образом, вызывающие абоненты могут решить, вызывать ли блокирующую или неблокирующую версию GetAge().Более того, они имеют доступ к будущему, поэтому могут строить продолжения поверх него и так далее.

Является ли эта идиома верной?Есть какие-то очевидные недостатки или проблемы, которые я пропускаю?Возможно, оно даже имеет официальное название?

Ответы [ 2 ]

3 голосов
/ 24 января 2012

Возвращение Task - это новый асинхронный способ C # 5 - он называется TAP: Асинхронный шаблон на основе задач .

Единственное отличие состоит в том, что метод называется GetAgeAsync.

Итак, да - этот подход рекомендуется, поскольку он облегчит портирование на асинхронный C # 5 после его освобождения.

2 голосов
/ 24 января 2012

Эта идиома кажется мне совершенно верной, и действительно поддержка асинхронности на основе Task станет большой функцией в будущих версиях .Net.

Однако я бы изменил вашу реализацию, чтобы метод блокировки GetAge не вызывал асинхронный метод, а затем ждал его - ненужные издержки при создании (возможно) нового потока.

...