Betrachten wir diese sehr einfache asynchrone Methode:
static async Task myMethodAsync()
{
await Task.Delay(500);
}
Wenn ich dies mit VS2013 (Pre Roslyn Compiler) kompiliere, ist die generierte Zustandsmaschine eine Struktur.
private struct <myMethodAsync>d__0 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
Wenn ich es mit VS2015 (Roslyn) kompiliere, lautet der generierte Code wie folgt:
private sealed class <myMethodAsync>d__1 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
Wie Sie sehen können, generiert Roslyn eine Klasse (und keine Struktur). Wenn ich mich richtig erinnere, haben die ersten Implementierungen der Unterstützung für asynchrone / warten im alten Compiler (CTP2012, denke ich) auch Klassen generiert, und dann wurde sie aus Leistungsgründen in struct geändert. (In einigen Fällen können Sie das Boxen und die Heap-Zuweisung vollständig vermeiden…) (Siehe hier )
Weiß jemand, warum dies in Roslyn wieder geändert wurde? (Ich habe kein Problem damit, ich weiß, dass diese Änderung transparent ist und das Verhalten von Code nicht ändert, ich bin nur neugierig)
Bearbeiten:
Die Antwort von @Damien_The_Unbeliever (und dem Quellcode :)) imho erklärt alles. Das beschriebene Verhalten von Roslyn gilt nur für den Debug-Build (und dies ist aufgrund der im Kommentar erwähnten CLR-Einschränkung erforderlich). In Release wird auch eine Struktur generiert (mit allen Vorteilen davon ..). Dies scheint also eine sehr clevere Lösung zu sein, um sowohl Bearbeiten als auch Fortfahren und eine bessere Leistung in der Produktion zu unterstützen. Interessantes, danke für alle, die teilgenommen haben!
async
Methoden haben fast immer einen echten asynchronen Punkt - einenawait
, der eine Kontrolle ergibt, für die die Struktur ohnehin eingerahmt werden müsste. Ich glaube, Strukturen würden den Speicherdruck nur fürasync
Methoden verringern , die zufällig synchron ausgeführt wurden.