2012-08-08 15 views
14

Mam jedną metodę asynchronicznej:Zalecana metoda podpis podczas zwracania danych wyjściowych z metody asynchronicznej?

public async Task<BitmapSource> GetBitmapAsync(double[] pixels); 

powiedzmy, że również mają tę klasę:

public class PixelData 
{ 
    public double[] Pixels { get; } 
} 

Teraz chcę utworzyć metody ogólnospożywczy produkujący wyjście BitmapSource metodą asynchroniczną powyżej robić Praca. Mogę wymyślić co najmniej trzy podejścia, aby to zrobić, ale nie jest dla mnie oczywiste, który powinienem wybrać z punktu widzenia wydajności i niezawodności.

Czy ktoś może poradzić; jakie są zalety i wady każdego z poniższych podejść?

Wariant A Tworzenie synchroniczny sposób, że zawraca Result z Task:

public BitmapSource GetBitmap(PixelData pixelData) 
{ 
    return GetBitmapAsync(pixelData.Pixels).Result; 
} 

Wariant B Tworzenie synchroniczny (lub jest asynchroniczny?), Która zwraca Task<BitmapSource>:

public Task<BitmapSource> GetBitmap(PixelData pixelData) 
{ 
    return GetBitmapAsync(pixelData.Pixels); 
} 

Wariant C Załóż asynchroniczną metodę jawnie używa await:

public async Task<BitmapSource> GetBitmapAsync(PixelData pixelData) 
{ 
    return await GetBitmapAsync(pixelData.Pixels); 
} 
+0

I chcesz, aby móc wywołać tej metody asynchronicznie również wygoda? Jeśli tak, z tego, co widzę na pierwszy rzut oka, dwie pierwsze opcje tego nie osiągną, tylko trzecia. –

+0

Niekoniecznie (czy chcę wywoływać asynchronicznie metodę wygody), ale jeśli jest to najbardziej niezawodny/poprawny sposób, to tak. –

+0

@AdamHouldsworth Przepraszam za moją niewiedzę w tej sprawie, ale czy opcja B będzie traktowana jako metoda synchroniczna _ dla pewnych_? Fakt, że zwraca 'zadanie ", jest nieistotny w odniesieniu do (a) synchroniczności? –

Odpowiedz

6

myślę, że jesteś zbyt myślenia to.

Masz metodę, która zwraca typ, który jest Task<T>. Chcesz metodę, która przyjmuje inny typ parametru i przechodzi do oryginalnej metody. Tak więc opcja B jest cienka:

public Task<BitmapSource> GetBitmap(PixelData pixelData) 
{ 
    return GetBitmapAsync(pixelData.Pixels); 
} 

Metoda powinna jednak być nazywana GetBitmapAsync.

Opcja A będzie sposobem na odsłonięcie synchronicznej (blokującej) wersji metody.

Wariant C nie faktycznie osiągnąć coś więcej niż Opcji B.

+0

Dzięki, Nicholas! Czy jest tak, że opcja C jest _właściwa niż opcja B, ponieważ dodawałaby redundantne operacje asynchroniczne? A może dwie opcje są równoważne wewnętrznie? –

+1

Nie ma za co, a tak - opcja C dodaje tylko koszty ogólne. –

+2

Ponadto opcja A [może powodować zakleszczenia] (http://nitoprograms.blogspot.com/2012/07/dont-block-on-async-code.html). Stephen Toub ma dobry filmik na temat asynchronicznej wydajności (http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-829T) i zwraca uwagę, że opcja C nie jest dobrym pomysłem (z przyczyn ogólnych) . –