2014-02-27 28 views
10

Microsoft.Bcl.Async ermöglicht Entwicklern die Verwendung von async/await Keywords ohne .NET Framework 4.5, auf die sie abzielen sollen, um sie zu verwenden.Wie funktioniert Microsoft.Bcl.Async?

Das ist großartig, dank der unglaublich harten Arbeit von Menschen in den Microsoft CLR- und Sprach-Teams.

Jetzt bin ich neugierig, wie das funktionieren kann.

async/await erfordern, dass der Compiler einige schwere Aufgaben ausführt, um Code in etwas umzuwandeln, das Operationen abwarten kann.

Der Compiler ursprünglich Fehler unter .NET Framework 4.0 wirft kompilieren, auch wenn es klar, was weiß async/await Mittelwert (Visual Studio 2012/2013.)

So, wie diese Bibliothek der Compiler erzählt nicht spezifisch zu werfen Kompilieren Sie Fehler, die mit asynchronen Operationen zusammenhängen, und führen Sie einige Code-Verbesserungen durch, genau wie unter .NET Framework 4.5?

+0

ich bearbeiten nur noch einmal, es zu ändern von verursachen verursacht. Aber trotzdem danke fürs bearbeiten. –

Antwort

10

async/await ist nichts anderes als C# 5.0-Compiler-Umwandlung. Es gibt keine async/await bei IL Ebene.

Ein einfaches Beispiel wäre die using() { }-Anweisung, die auch eine Compiler-Umwandlung ist. Es konvertiert nur die using Anweisung in try/finally Block. Es besteht jedoch eine Abhängigkeit von der Existenz der Schnittstelle IDisposable, die in .NET 1.1 definiert ist. Die async/await Transformation hängt von bestimmten Typen wie IAsyncStateMachine Schnittstelle ab, die in .NET 4.5 definiert sind. Die Microsoft.Bcl.Async ruft diese Typdefinitionen in .NET 4.0 ab.

EDIT

Wie funktioniert die Microsoft.Bcl.Async Montag der Compiler verursacht ein neues Schlüsselwort zu erkennen (async/erwarten)?

Nein, tut es nicht. Der C# 5.0-Compiler kennt bereits die Schlüsselwörter und was damit zu tun ist. Die erforderlichen Typen können jedoch nicht gefunden werden, da das Projekt auf .NET 4.0 ausgerichtet ist. Das Microsoft.Bcl.Async Paket bringt diese Typen ein.

+0

Danke. Aber wie sagt Microsoft.Bcl.Async dem Compiler, seinen eigenen Typ zu verwenden, der stattdessen wie IAsyncStateMachine funktioniert? Ich denke, der Compiler sucht immer nach dem bestimmten Typ, um async/abwarten zu können? –

+3

Rechts, 'Microsoft.Bcl.Async' hat dieselben Namespaces und dieselben Typnamen wie in .NET 4.5 definiert. – YK1

+0

Vielen Dank für Ihre großartige Antwort. –

-3

MS2012 ist .net Installation 4.5 so kann man nicht ‚kompiliert Fehler mit 4.0‘ erhalten, wie Sie beschrieben

+0

Während 4.5 der neue Standard in VS2012 ist, können Sie immer noch mit .NET 4.0 entwickeln, wo der Compiler ** ** einen Fehler verursacht. Der einzige praktische Unterschied zwischen VS2010 und VS2012 liegt in der Fehlerbeschreibung. –

+0

Ich bekomme Compiler Fehler mit 4.0, aber der Fehler ist sicherlich nicht über async/warten, aber bestimmte Typ wie System.Runtime.CompilerServices.IAsyncStateMachine fehlt. Ich schätze es. –