asynchrone programmierung mit c# - thomas claudius huber · pdf filethomas claudius huber...

24
Thomas Claudius Huber Asynchrone Programmierung mit C#

Upload: nguyenkien

Post on 06-Feb-2018

227 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Thomas Claudius Huber

Asynchrone

Programmierung mit C#

Page 2: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Thomas Claudius Huber

• Principal Consultant @ Trivadis AG

Trainer, Coach, Developer, Architect

www.thomasclaudiushuber.com

• Spezialisiert auf WPF, XAML, WinApps

• Autor der umfassenden Handbücher

zu WPF, Silverlight und

Windows Store Apps

Page 3: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Sessioninhalt Tasks und async & await

Progress, Cancellation & more

.NET vs. WinRT

Page 4: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Asynchron in .NET

• «Asynchronous Programming Model» (APM)

• BeginInvoke und EndInvoke

– AsyncCallback und IAsyncResult

• Bekannt von Streams und Sockets

Page 5: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Asynchron in .NET

• «Event-based asynchronous pattern» (EAP)

– kam in .NET 2.0

• Zu einer [...]Async-Methode gibt es ein

[...]Completed-Event

– bspw. LoadAsync und LoadCompleted

Page 6: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Event-based asynchronous

pattern

private static void EventBasedAsynchronousPattern()

{

var wc = new WebClient();

wc.DownloadStringCompleted += (sender, eventArgs) =>

{

string html = eventArgs.Result;

// ...

};

wc.DownloadStringAsync(

new Uri("http://www.thomasclaudiushuber.com"));

}

Page 7: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

.NET 4.0 – Task Parallel

Library• Neuer Namespace System.Threading.Tasks

• Task lässt sich auf neuem Thread starten

– Task.Factory.StartNew

Demo

Page 8: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Verschiedene Funktionen

• Warten bis der Task fertig ist

– myTask.Wait();

– Task.WaitAll(params Task[] tasks);

– Task.WaitAny(params Task[] tasks);

• Task verzögern

– Task.Delay (.NET 4.5)

• Task mit Action fortsetzen

– myTask.ContinueWith(Action action);

Page 9: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Task-based

asynchronous pattern (TAP)• Baut auf Task Parallel Library (TPL) auf

• Sprachunterstützung in C# und VB.NET

– async und await

• Verfügbar für verschiedene Microsoft-Platformen

– Web, Desktop, WinRT etc.

Page 10: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Asynchrone Methoden

• Nutzen das async Schlüsselwort

– enden konventionsgemäss auf “Async”

• Geben die Kontrolle an den Aufrufer zurück

• Haben üblicherweise mindestens

eine “await”-Anweisung

Demo

Page 11: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Rückgabetypen

asynchroner Methoden• void – der Aufrufer benötigt keine Info

– wird nur für EventHandler verwendet

• Task – der Aufrufer erhält Info zum Task-Zustand

– bspw. ob der Task «completed» ist

• Task<T> - neben dem Task-Zustand erhält der

Aufrufer den Rückgabewert

Demo

Page 12: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Asynchron vs. Multithreading

• CPU-lastiges in neuen Thread auslagern

– Task.Run / Task.Factory.StartNew

• Für andere APIs wird kein neuer Thread erstellt, sie

sind jedoch asynchron:

– bspw. WebClient-Klasse und deren

DownloadStringTaskAsync-Methode

Page 13: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Was passiert im Hintergrund

• await/async sind für den Compiler

• async markiert eine Methode, die der Compiler

ändert

• In der Methode wird eine Art Statemachine generiert

– basiert auf einer TaskAwaiter-Instanz

Demo

Page 14: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Sessioninhalt Tasks und async & await

Progress, Cancellation & more

.NET vs. WinRT

Page 15: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Fortschritt / Progress

• Async-Methode nimmt IProgress<T> entgegen

• Aufrufer gibt eine Progress<T>-Instanz an

• Progress<T> kapselt Action als Callback

Demo

Page 16: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Abbruch eigener Async-

Methoden• Als Parameter ein CancellationToken

entgegennehmen

• Die IsCancellationRequested-Property prüfen und

die Methode verlassen

– vorher kann Cleanup stattfinden

• Alternativ die ThrowIfCancellationRequested-

Methode nutzen

Demo

Page 17: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Tasks abbrechen

• CancellationTokenSource erstellen

• Wert der Token-Property (CancellationToken) an

Async-Methode übergeben

• Auf CancellationTokenSource die Cancel-Methode

aufrufen

Demo

Page 18: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Exceptions

• Eine await-Anweisung kann in einen try/catch-Block

gepackt werden.

• Im asynchronen Code geworfene Exceptions werden

somit beim await im catch-Block abgefangen

Demo

Page 19: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Sessioninhalt Tasks und async & await

Progress, Cancellation & more

.NET vs. WinRT

Page 20: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

User Interfaces

• Synchrone Eventhandler blockieren das UI

• Touch gegenüber Maus/Tastatur hochempfindlich

– Verzeiht keine Verzögerungen

• WinRT => alles was länger als 50ms dauern

könnte, ist nur asynchron verfügbar

Page 21: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

.NET vs. WinRT

.NET

Task

Task<T>

WinRT

IAsyncAction

IAsyncOperation

IAsyncActionWithProgress

IAsyncOperationWithProgress

Demo

Page 22: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Cancellation & Progress

• IAsyncOperationWithProgress mit AsTask-Extension-

Methode in Task umwandeln

• Extension-Methode nimmt IProgress<T> und

CancellationToken entgegen

• .NET-Knowhow lässt sich wiederverwenden.

Page 23: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Sessioninhalt Tasks und async & await

Progress, Cancellation & more

.NET vs. WinRT

Page 24: Asynchrone Programmierung mit C# - Thomas Claudius Huber · PDF fileThomas Claudius Huber • Principal Consultant @ Trivadis AG Trainer, Coach, Developer, Architect • Spezialisiert

Danke

Twitter: @thomasclaudiush

Homepage: www.thomasclaudiushuber.com

Mail: [email protected]

Slides/Demos:

www.thomasclaudiushuber.com/blog