2012-01-24 14 views
5

Korzystając z TPL z .NET 4, staram się zdecydować, jak zaprojektować interfejsy API, które zajmują się przyszłością. Jedną z możliwości, które dotarło do mnie to, aby naśladować wzór asynchronicznej ale bez metody End(IAsyncResult):Czy istnieje ten idiom TPL?

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

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

Jako takie, dzwoniący może zdecydować, czy zadzwonić blokowanie lub non-blocking wersja GetAge(). Co więcej, mają dostęp do przyszłości, dzięki czemu można konstruować kontynuacje na jej szczycie itp.

Czy ten idiom jest ważny? Czy są jakieś oczywiste wady lub problemy, których mi brakuje? Czy może ma nawet oficjalną nazwę?

+0

Twój drugi przypadek bardzo skorzysta na "oczekującym" moim zdaniem. – user7116

+0

FYI, Stephen Toub opublikowal o tym (oferowanie wrapperów sync dla metod asynchronicznych) - tl; dr uniknij tego :) zobacz http://blogs.msdn.com/b/pfxteam/archive/2012/04/13/10293638. aspx i również http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx –

Odpowiedz

3

Zwrócenie numeru Task to nowy sposób asynchroniczny C# 5 - nazywane jest to TAP: Task-based Asynchronous Pattern.

Jedyna różnica polega na tym, że metoda nosi nazwę GetAgeAsync.

Tak, tak - to podejście jest zalecane, ponieważ ułatwi przejście do asynchronizmu C# 5 po jego zwolnieniu.

+0

Bardzo pomocne odniesienie - dzięki. –

2

Ten idiom wydaje mi się całkowicie ważny i rzeczywiście wsparcie dla Task opartej asynchronii będzie dużą cechą w nadchodzących wersjach .Net.

Jednak chciałbym zmienić implementację, aby metoda blokująca GetAge nie wywoływała metody asynchronicznej, a następnie czekać na nią - nie jest konieczne dodatkowe obciążenie (potencjalnie) tworzenia nowego wątku.

+0

Można zamienić relację między metodami i uzyskać 'BeginGetAge()' return 'Zadanie .Factory.StartNew (() => GetAge())'. –

+0

@SeanU Precisely. –

+1

Cóż, nie sądzę, aby utworzyć nowy wątek tak bardzo, jak kontekst przełącznika do istniejącego wątku. I nawet wtedy to do planisty należy decyzja, czy jest to konieczne. Ale rozumiem, a sugestia Seana ma sens. –

Powiązane problemy