390 likes | 538 Views
Peter Monadjemi | ActiveTraining. Was ist neu bei VB11?. Die Themen. Co-Evolution VB hat aufgeholt Die (drei) Neuerungen auf einen Blick Asynchrone Aufrufe neu definiert Iteratoren Entwickeln für Windows 8 Weitere Neuerungen bei VS 11 und .NET 4.5 Ein Blick in die nähere Zukunft.
E N D
Peter Monadjemi | ActiveTraining Was ist neu bei VB11?
Die Themen • Co-Evolution • VB hat aufgeholt • Die (drei) Neuerungen auf einen Blick • Asynchrone Aufrufe neu definiert • Iteratoren • Entwickeln für Windows 8 • Weitere Neuerungen bei VS 11 und .NET 4.5 • Ein Blick in die nähere Zukunft
Co-Evolution • „VB und C# werden in Zukunft gemeinsam weiterentwickelt“ Anders Heljsberg, Distinguished Engineer bei Microsoft (und „Vater“ von Turbo Pascal und Delphi) im Juni 2009
C# nähert sich VB an • Über das dynamic-Schlüsselwort ist eine späte Bindung möglich • Optionale und benannte Argumente bei Methoden • C# hat damit VB „eingeholt“ - lediglich „Inline-XML“ gibt es nicht
VB nähert sich C# an • Ein – und mehrzeilige Lambdas • Einzeilige Properties • Collection-Initialisierer • Mit VB11 auch Iteratoren • Ein paar Kleinigkeiten fehlen, z.B. ein direktes Pendant zum delegate-Befehl und den anonymen Methoden (Lambdas bei VB) delegateintFunDel(int x1, int x2); FunDel f1 = delegate(int p1, int p2) {return p1 + p2;};
VB hat aufgeholt • XNA 4.0 – DirectX-Spiele können auch in VB entwickelt werden • .NET MicroFramework ab Version 4.2 – VB-Code läuft auf kleinen RISC-CPUs • Microsoft Surface 2.0 SDK enthält VB-Beispiele • Windows Phone 7 – VB-Code läuft (unter Silverlight) auf einem SmartPhone • Im Rahmen von Silverlight läuft VB-Code auch unter Mac OS X • Es gibt keine Abhängigkeit zur VB-Laufzeit (Namespace Microsoft.VisualBasic) mehr
Die (drei) Neuerungen bei VB 11 • Implementierung des Task-basedAsynchronous Pattern (TAP) durch die Schlüsselwörter Async und Await • Iteratoren über das Schlüsselwort Iterator • Der Stammnamespace kann über Global überschrieben werden (wie in C#) • Ich hoffe, ich habe nichts vergessen;) • Eventuell enthält die aktuelle Beta1 noch etwas
Asynchrone Aufrufe • Warum? Vorteile? • Das Task-basedAsynchronous Pattern (TAP) in .NET 4.5 • Neu bei VB11: Async und Await • Ein paar Beispiele • Beispiele basieren auf der Async CTP 3 für VS 2010 SP1 – mit .NET 4.5 wird es kleinere Änderungen geben
Asynchrone Aufrufe – warum? • Problem: Länger dauernde Operationen blockieren den UI-Thread • Warten auf eine Antwort einer Web-Anfrage • Warten auf eine Datenbankabfrage • Umfangreichere Berechnung • usw. • Vor allem bei mobilen Anwendungen darf die UI nicht „einfrieren“
Asynchrone Aufrufe – Lösungsansätze • Es gibt verschiedene Lösungsansätze: • Begin<Operation>/End<Operation>-Entwurfsmuster aus .NET 1.x (z.B. FileStream-Klasse) • Auslagern auf einem Backgroundthread aus dem Threadpool • Asynchrone Aufrufe über Delegaten, BeginInvoke und einem Callback • Einige wenige.NET-Methoden sind von Haus aus asynchron und melden sich über ein Event (z.B. DownloadStringAsyncder WebClient-Klasse) • Die BackgroundWorker-Komponente (der einfachste Ansatz)
Asynchrone Aufrufe – Schwachpunkte der vorhandenen Ansätze • Erhöhter Implementierungsaufwand • Viele Entwickler schrecken vor Delegaten, asynchronen Callbacks zurück (wirken kompliziert) • Was ist mit vorzeitigem Abbruch oder einer Fortschrittsmeldung? • Die Programmlogik muss angepasst werden • Threads kosten Ressourcen (1 Mbyte Arbeitsspeicher pro Thread?)
Asynchrone Aufrufe – Neu: TAP • TAP – Task-basedasynchronous Patterns • Empfehlung von Microsoft für die Umsetzung und den asynchronen Aufruf beliebiger Methoden • Unbedingt das White-Paper lesen http://www.microsoft.com/download/en/details.aspx?id=19957
Asynchrone Aufrufe – TAP im Detail (1) • Basiert auf den mit .NET 4.0 eingeführten Tasks • Ein Task steht für eine Operation (Methode), die vom Task Scheduler ausgeführt wird • Es gibt nur ein Methode • Namenskonvention: <Operation>TaskAsync • Gibt immer ein Task- bzw. Task(Of T)-Objekt zurück
Asynchrone Aufrufe – TAP im Detail (2) • Die TaskAsync-Methode kehrt „sofort“ zurück • Der Initialisierungscode (sofern vorhanden) wird synchron ausgeführt • Die Rückgabe ist immer ein Task-Objekt • Der Hauptteil wird asynchron ausgeführt, das Ergebnis wird über das Task-Objekt zur Verfügung gestellt • Exceptions werden ebenfalls über das Task-Objekt zur Verfügung gestellt • Ein TaskAsync-Methode kann über ein CancellationToken jederzeit abgebrochen werden
Asynchrone Aufrufe – ein Beispiel für eine TAP-Methode Eine TaskAsync-Methode gibt ein Task(Of T)-Objekt zurück Dim T = Wc.DownloadStringTaskAsync("http://basta.net") Dim Content = Await T Task(Of String) Ohne den Umweg über eine Task(Of T)-Variable Dim Content = AwaitWc.DownloadStringTaskAsync("http://basta.net") Befehl1Befehl2 Nicht blockierend Werden über einen Callback erst nach Beendigung des Tasks ausgeführt
Asynchrone Aufrufe - TAP bei .NET 4.5 • .NET 4.5 implementiert TAP auf zwei Ebenen • Es gibt verschiedene AsyncTask-Methoden, z.B. DownloadStringAsyncTask bei der WebClient-Klasse • Über die Schlüsselwörter Async und Await (async und await bei C#)
Ein erstes Beispiel Vorher: Synchroner Download mehrerer Webseiten FunctionDownloadWebContent() As Integer DimWc As New WebClient Dim Anzahl = Wc.DownloadString("http://basta.net").Length Anzahl += Wc.DownloadString("http://heise.de").Length Anzahl += Wc.DownloadString("http://www.activetraining.de").Length Return Anzahl End Function Nachher: Asynchroner Download dank Async und Await AsyncFunctionDownloadWebContentAsync() As Task(Of Integer) DimWc As New WebClient Dim Content = AwaitWc.DownloadStringTaskAsync("http://basta.net") Dim Anzahl = Content.Length Content = AwaitWc.DownloadStringTaskAsync("http://heise.de") Anzahl += Content.Length Content = AwaitWc.DownloadStringTaskAsync("http://www.activetraining.de") Anzahl += Content.Length Return Anzahl End Function
Die Rolle von Await (1) • Neuer Operator in VB 11 • Kann nur in Subs/Functions eingesetzt werden, die mit Async deklariert sind (=asynchrone Methode) • Wartet auf das Resultat des gestarteten Tasks, ohne den Thread zu blockieren • Await „splittet“ die Methode in zwei Abschnitte auf • Abschnitt 1 legt den Task an und kehrt zurück • Abschnitt 2 umfasst die auf Await folgenden Befehle, die über einen Callback aufgerufen werden
Die Rolle von Await(2) AsyncSub Test() Dimz = AwaitTuWas() Console.WriteLine(z) End Sub AsyncFunctionTuWas() As Task(Of Integer)AwaitTaskEx.Delay(5000) Return AwaitTaskEx.Run(Of Integer)(Function()Return 1234 End Function) End Function Wird nach Beendigung des Tasks ausgeführt
Beispiel: Asynchroner RSS-Reader • WPF-Anwendung • RSS-Feeds werden über DownloadStringAsyncTask heruntergeladen • Abbruch jederzeit möglich • Fortschrittsanzeige über IProgress-Schnittstelle
Mehrere Tasks zusammenfassen Vorher: WhenAll fasst mehrere Tasks zu einem Task zusammen Async Sub DownloadUrls()DimUrlListe() = {"http:/www.heise.de", "http:///www.basta.net", "http://dotnet.de", "http://msnd.com"}DimAlleTasks As IEnumerable(Of Task) = Fromurl In UrlListe Select TuWasAsync(url) ' Genial: WhenAll fasst alle Tasks zu einem neuen Task zusammen und Await wartet, dass alle Tasks fertig sindAwaitTaskEx.WhenAll(AlleTasks)Console.WriteLine("Alle Tasks haben fertig...")End Sub Genial: Methodenaufruf, der ein Task-Objekt liefert, aus der LINQ-Abfrage herausl AsyncFunctionTuWasAsync(Url As String) As Task(Of Boolean)AwaitTaskEx.Run(New Action(Sub()Console.WriteLine("Verarbeite {0} auf Thread-ID: {1}", Url, Thread.CurrentThread.ManagedThreadId)Thread.Sleep(5000) End Sub)) Return True End Function Hilfsklasse der Async CTP Künstliche Verzögerung Thread aus Threadpool
Iteratoren • Was ist ein Iterator? • Ein Beispiel zur Einstimmung • Weitere Beispiele
Iteratoren - Was ist ein Interator? • Iterator = Funktion vom Typ IEnumerable(Of T), die wie eine Collection durchlaufen wird • Wird mit dem neuen Iterator-Schlüsselwort implementiert • Ein Wert wird über den neuen Yield-Befehl zurückgegeben • Vorteil: Die Rückgabe der einzelnen Werte lässt sich steuern • Vorteil: Generell mehr Flexibilität • Der LINQ-Effekt: Sobald man sich daran gewöhnt hat, verwendet man es bei der jeder Gelegenheit
Iteratoren – ein Beispiel zur Einstimmung Beispiel: Ein Range-Methode gibt einen Zahlenbereich zurück Variante A: Dim Zahlen = Range1(4, 10) Iterator Function Range1(Min As Byte, Max As Byte) As IEnumerable(Of Byte) For i = Min To Max Yield i Next End Function Variante B: Function Range2(Min As Byte, Max As Byte) As IEnumerable(Of Byte) Return Iterator Function() For i = Min To Max Yield I Next End Function.Invoke()End Function
Iteratoren – mit einem Lambda Beispiel: Ein Lambda-Iterator gibt einen Zahlenbereich zurück Dim Zahlen = Iterator Function(min As Integer, max As Integer) For i = min To max Yield i Next End Function.Invoke(4, 5) Aufruf des Lambda
Iteratoren und Inline-XML Beispiel: Ein Lambda-Iterator gibt einen Zahlenbereich zurück Dim RSS = <?xml version="1.0"?> <RSS> <chanell> <%= Iterator Function() For Each M In Meldungen Yield <item> <title><%= M.Titel %></title> <date><%= M.Zeitpunkt.ToShortDateString()></date> </item> Next End Function.Invoke() %> </chanell> </RSS> XElement-Objekt Collection mit Meldung-Objekte Lambda-Iterator Xdocument-Objekt
Iteratoren – Weitere Beispiele • Implementierung einer einfachen State-Machine • Durchlaufen eines Baums
Entwickeln für Windows 8 • Neu: Windows Runtime anstelle von .NET Runtime • Metro Style-Anwendungen als neuer Anwendungstyp • Die Rolle von Visual Basic
Die Windows Runtime (Windows RT) • Laufzeit für Windows 8 Metro Style-Anwendungen • Umfasst ca. 1.800 Klassen • Kapselt viele Win32-API-Funktionen • Wird über COM-Schnittstellen angesprochen (IUnknown ist zurück) • Über „Projections“ Schnittstellen zu NET, C++ usw. • Es gibt eine .NET-Metro-Klassenbibliothek (Metro Style Profile) • Der Name ist .NET for Metro Style Apps • Teilmenge der .NET-Klassenbibliothek • Teilweise nicht kompatibel (andere Typen- und Membernamen)
Metro Style Apps • Neues Oberflächenmodell - das erste seit Windows 95 (!) • Im Mittelpunkt stehen die mit der Windows Phone 7-Oberfläche (Metro) eingeführten Kacheln • Kacheln – Einstiegspunkt für eine Anwendung • Optimiert für Touch-Oberflächen
Die Rolle von Visual Basic • Windows 8 enthält die .NET 4.5-Laufzeit • Entwickelt wird mit VS 11 bzw. VS 11 Express Edition • Zahlreiche Vorlagen • Oberfläche wird in XAML definiert • Silverlight-Apps können mit geringem Aufwand umgestellt werden • Anwendungen werden nach wie vor von der CLR (4.5) ausgeführt
Verbesserungen bei .NET 4.5 und VS 11 • Neue Klassen, z.B. HttpClient • Implementierung des Task-basedAsynchronous Pattern • Neuer WPF- und Silverlight-Designer • Der Designer aus Expression Blend wurde in die Visual Studio-IDE „eingepflanzt“ • Wichtige Verbesserungen beim Thema Application Life Cycle Management (ALM)
Roslyn– Compiler als Service • Die Compiler-Infrastruktur wird aufgebohrt und ihre Funktionalitäten werden über Klassen zur Verfügung gestellt • Entwickler können sich damit eigene Syntaxparser oder Codegeneratoren schreiben • Seit Oktober 2011 gibt es eine erste CTP – möglicherweise Teil des Nachfolgers von .NET 4.5
Roslyn – viele neue Möglichkeiten • Die Compiler-Klassen standen bei .NET schon immer zur Verfügung • Namespace System.CodeDom.Compiler • Damit lässt sich zur Laufzeit Quellcode in eine Assembly kompilieren und ausführen • Roslyn bietet einen Zugriff auf die einzelnen Phasen der Kompilierung und den resultierenden Syntaxbaum, der das kompilierte Programm repräsentiert • Neben einer Syntaxanalyse ist eine auch eine semantische Analyse des Codes möglich
Roslyn – Beispiele aus der CTP • VisualBasicToCSharpConverter • Konvertiert VB-Code nach C# • RemoveByValVB • Entfernt überflüssige ByVal`s • OrganizeSolutionVB • Sortiert Import-Anweisungen • ConvertToAutoPropertyVB • Konvertiert „leere“ Property-Definitionen in Auto-Properties • ScriptingIntro(aktuell nur C#) • C#-Shell mit einem C#-Intepreter
Ein Blick in die Zukunft (1) • Das Innovationstempo wird sich bei der Sprache sicherlich verlangsamen • Die „wir müssen die VB6-Entwickler zurückgewinnen“-Phase ist bei Microsoft wieder vorbei • Alle wichtigen Sprachelemente sind implementiert • Die Möglichkeit jede Methode asynchron aufrufen zu können ist ein wichtiger Schritt in die richtige Richtung - vor allem für VB-Entwickler
Ein Blick in die Zukunft (2) • Ein paar Anregungen für künftige Sprachelemente bei VB und C# findet man sicher bei F# • Roslyn wird neue IDE-Tools ermöglichen • C#->VB-Konverter • Eine VB.NET-Skript-Shell • Wer braucht weitere Features? Die aktuell vorhandene Funktionalität ist mehr als ausreichend
Feedback und Fragen • Bitte Feedbackbogen ausfüllen • Bei Fragen rund um VB – pm@activetraining.de • Mein Visual Basic-Kompendium kommt im Herbst 2012 ! • Der rote Faden ist die „Moderne Visual Basic-Programmierung“