2012-01-24 4 views
5

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

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

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

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

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

+0

Ваш второй случай сильно выиграет от 'ожидания ', я верю. – user7116

+0

FYI, Стивен Туб опубликовал об этом (предлагая обертки для асинхронных методов) - tl; dr избегает этого :) см. Http://blogs.msdn.com/b/pfxteam/archive/2012/04/13/10293638. aspx, а также http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx –

ответ

3

Возврат Task - новый асинхронный способ C# 5 - это называется TAP: Task-based Asynchronous Pattern.

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

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

+0

Очень полезная ссылка - спасибо. –

2

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

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

+0

Можно обменять отношения между методами и «BeginGetAge()« return »Task .Factory.StartNew (() => GetAge())'. –

+0

@SeanU Точно. –

+1

Ну, я не думаю, что он создаст новый поток, так же как контекст переключения в существующий поток. И даже тогда для планировщика решать, нужно ли это. Но я беру вашу мысль, и предложение Шона имеет смысл. –

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