Z ciekawości, staram się trochę prosty kod async
/await
skompilować pod .NET 3.5 Client Profile:Jaki jest minimalny zestaw typów wymaganych do kompilacji kodu `asynchronicznego`?
async void AwaitFoo()
{
await new Foo();
}
class Foo
{
public IFooAwaiter GetAwaiter() { … }
}
interface IFooAwaiter : System.Runtime.CompilerServices.INotifyCompletion
{
bool IsCompleted { get; }
void GetResult();
}
jestem doskonale świadomy, że .NET 3.5 nie obsługuje tej funkcji języka, wyrażone przez ten błąd kompilacji:
Cannot find all types required by the
async
modifier. Are you targeting the wrong framework version, or missing a reference to an assembly?
Jestem też świadomy NuGet package Microsoft.Bcl.Async
, który nie posiada wsparcia dla .NET 3.5.
Pytanie: Jaki jest minimalny zestaw typów & członkowie typu wymagana async
kodu skompilować? Czy ten minimalny zestaw został oficjalnie udokumentowany; a jeśli tak, to gdzie? (Zauważ, że jestem zainteresowany tylko udanej kompilacji, a nie wykonanie.)
co mam do tej pory:
Próbowałem znaleźć ten minimalny zestaw typów przez eksperyment, który wydaje się być możliwe, ponieważ raportów wymaganych kompilatora, ale brakuje rodzaje jeden po drugim:
Predefined type
System.Runtime.CompilerServices.IAsyncStateMachine
is not defined or imported.
Definiowanie zgłoszony typ według stron referencyjnych MSDN prowadzi następnie do następnego brakującym typu są zgłaszane. I tak daleko:
System.Runtime.CompilerServices.IAsyncStateMachine
System.Runtime.CompilerServices.INotifyCompletion
(wymagane przez kod przykładu)System.Threading.Tasks.CancellationToken
(wymaganychTask
)System.Threading.Tasks.TaskCreationOptions
(wymaganychTask
)System.Threading.Tasks.Task
W tym momencie s zwieńczone, ponieważ Task
ma wielu członków, ale kompilator nie zgłasza dokładnie, których członków wymaga; po prostu zgłasza typ jako całość. Mogę zatem odtworzyć znacznie więcej definicji typu niż to, co jest rzeczywiście potrzebne.
Dzięki. Czy dowiedziałeś się o typach na twojej liście, czy też wziąłeś listę z oficjalnej dokumentacji? - Dziękuję również za link do Eduasync, już zacząłem czytać te artykuły na blogu. – stakx
@stakx: Cóż, początkowo tworzyłem listę, kiedy się rozwijałem i zaimplementowałem fragmenty Eduasync - ale teraz patrzę na typy, które wiem, że kompilator używa w wygenerowanym kodzie. –