2013-01-07 9 views
5

chciałem zrobić awaitable tablicy wdrażając metodę rozszerzeniaCzekaj na tablicę; wdrażając metodę rozszerzenia dla tablicy

public static IAwaitable GetAwaiter(this mytype[] t) 
{ 
    return t.First().GetAwaiter(); 
} 

ale mimo IntelliSense mówi „(awaitable) mytype[]”, kompilator daje mi błąd podczas korzystania

mytype[] t = new mytype[] { new mytype(), new mytype() }; 
await t; 

Dzwonienie czeka na jeden obiekt mytype działa poprawnie. Dlaczego? czy robię coś źle? Dzięki za pomoc.

+0

Czekaj na połączenia asynchroniczne, dlaczego używasz go z typami? – prthrokz

+1

Jaki błąd otrzymujesz? –

+1

BTW: Używanie ['TaskCompletionSource '] (http://msdn.microsoft.com/en-us/library/dd449174.aspx) wydaje się lepsze niż implementowanie własnej klasy: http://stackoverflow.com/ pytania/6731815/asyncctp-creation-a-class-to-is-iawaitable –

Odpowiedz

3

Myślę, że jest to błąd w kompilatorze i powinieneś report it.

mogę sprawdzić, że ten kod nie działa (używając Task i TaskAwaiter, nie typy niestandardowe):

public static TaskAwaiter GetAwaiter(this Task[] tasks) 
{ 
    return tasks.First().GetAwaiter(); 
} 

Task[] tasks = …; 
await tasks; 

(Produkuje się błąd „Nie można oczekiwać„System.Threading.Tasks.Task [] „”, jak podano)

Ale zamiana tablicy dla IEnumerable (zarówno w sposobie i lokalna) działa.

public static TaskAwaiter GetAwaiter(this IEnumerable<Task> tasks) 
{ 
    return tasks.First().GetAwaiter(); 
} 

IEnumerable<Task> tasks = …; 
await tasks; 

Interes tingly, ze stałą wersją, oczekując na tablicę bezpośrednio nadal nie działa. Ale na przykład oczekuje na IList działa.

+0

Poszedłem za twoją radą i zgłosiłem to (zobacz https://connect.microsoft.com/VisualStudio/feedback/details/775990/await-array-by-implementing-extension-method-for-array-does-not-compile) . Dziękuję za wysiłek dochodzeniowy. – David

Powiązane problemy