SlideShare a Scribd company logo
1 of 40
Parallele Softwareentwicklung mit .NET 4.0 Vorteile & Neuerungen und Einsatzmöglichkeiten der Parallel Extensions
Was istparalleleProgrammierung? AufteilungeinerAufgabe in Teilaufgaben die parallel bearbeitetwerden Machtsich die RechenkraftmehrererProzessoren / Cores zunutzen
WozuparalleleProgrammierung? Single Core Systeme User Interface nichtblockieren AsynchroneOperationen Synchronisation
WozuparalleleProgrammierung? Server skalierenschonmit Multi-CPU User Systemebesitzen Multi-Core Ressourcenmüssengenutztwerden
Statistik
ParalleleProgrammierung – vor .NET 4.0 Synchrones & Asynchrones Threading Nachteil Thread Overhead ThreadPool Geeignetfür Fire and Forget Einmalgestartete Threads könnennichtkontrolliertwerden Nachteile Warten Abbruch Weitermachen Debugging Etc.
Von Threads zu Tasks Threads und Tasks sindsehrähnlich Threads erlaubenparalleleAusführunginnerhalbeinesProzesses Symbolisch die Arbeiter des Prozesses Tasks  basieren auf Threads Symbolisch die Arbeit die den Arbeiternaufgetragenwird Mit der Task Parallel Library in .NET 4.0 eingeführt
ThreadPool Global Queue Worker Thread 1 Worker Thread 1 … Item 4 Item 5 Program Thread Item 1 Item 2 Item 3 Item 6 Thread Management: ,[object Object]
Idle Thread Retirement,[object Object]
Idle Thread Retirement
Hill-climbing,[object Object]
Der Action/Func Delegate BeinhalteteineMethode die keinenRückgabewertbesitzt Kannmehrere Parameter besitzen
Task ohne Parameter und Rückgabewert staticvoid Main(string[] args) { Action Action1 = newAction(Compute); Task Task1 = newTask(Action1);     Task1.Start(); } staticvoid Compute() { Console.WriteLine("Computing..."); System.Threading.Thread.Sleep(1000); Console.WriteLine("Computing finished..."); } Action Delegat Action dem Task Objekt zuweisen Task Starten
Task mit Parameter und ohneRückgabewert Action Delegat mit Parameter vom Typ object staticvoid Main(string[] args) { Action<object> Action1 = newAction<object>(Compute); Task Task1 = newTask(Action1, "Parameter 1");     Task1.Start(); } staticvoid Compute(object Parameter) { Console.WriteLine("Computing with Parameter " + Parameter + "..."); System.Threading.Thread.Sleep(1000); Console.WriteLine("Computing finished..."); } Action dem Task Objekt zuweisen & Parameter übrgeben Parameter verarbeiten
Task ohne Parameter mitRückgabewert Func dem Task mit Rückgabetyp string zuweisen Func Delegat mit Rückgabetyp string staticvoid Main(string[] args) { Func<string> Func1 = newFunc<string>(Compute); Task<string> Task1 = newTask<string>(Func1);     Task1.Start(); Console.WriteLine("Result was " + Task1.Result); } staticstring Compute() { Console.WriteLine("Computing..."); System.Threading.Thread.Sleep(1000); Console.WriteLine("Computing finished..."); return"Result"; } Rückgabewert abrufen Passende Signatur Wert zurückgeben
Task mit Parameter und Rückgabewert Func Delegat mit Rückgabetyp string und Parameter object staticvoid Main(string[] args) { Func<object, string> Func1 = newFunc<object, string>(Compute); Task<string> Task1 = newTask<string>(Func1, "Parameter1");     Task1.Start(); Console.WriteLine("Result was " + Task1.Result); } staticstring Compute(object Parameter) { Console.WriteLine("Computing with Parameter " + Parameter + "..."); System.Threading.Thread.Sleep(1000); Console.WriteLine("Computing finished..."); return"Result"; } Func dem Task mit Rückgabetyp string zuweisen & Parameter übergeben
Lambda Ausdrücke BildenanonymeFunktion die Ausdrücke und Anweisungenenthält Syntax WichtigeOperatoren => “wirdzu” ()  definiertEingangsparameter {} umschließteineReihe von Anweisungen Werden oft zusammenmit LINQ verwendet Wichtig Lambda Expressions können auf Variablen der einschließendenMethode / Typzugreifen
Lambda Ausdrücke Delegat zum speichern der Anonymen Funktion Lambda Ausdruck x wird zu x * x delegateintdel(int i); staticvoid Main(string[] args) { delmyDelegate = x => x * x; int j = myDelegate(5); //j = 25 } Aufruf der Anonymen Funktion mittels Delegat
TaskCreationOptions BietetOptionenfür die Behandlung des Tasks durch den Taskmanager None PreferFairness LongRunning AttachedToParent
Task Abbruch EinheiklesThemamit Multithreading Ziele Wahren von Teilergebnissen Vermeiden von HolzhammerwieThread.Abort Zuverlässige und sichereAbbruchmethode Tasks werdendurchCancellationTokenbeendet Abbruchwird von CancellactionSourceangefordert, abernichtunbedingtsofortausgeführt GewährleistetsicheresAbbrechen von Tasks ImwesentlichenwieAbortvariable
CancellationSource BeinhaltetCancellationToken Threadsicherevom Framework zurVerfügunggestellteAbortvariable Wirdfür Tasks verwendet, kannaberauchfürkonventionelles Threading benutztwerden Aufruf von CancellationSource.CancelsetztCancellationToken.IsCancellationRequested auf true (irreversibel)
CancellationToken MehrereMöglichkeiten auf Cancel Request zureagieren Polling RegelmäßigIsCancellationRequestedüberprüfenwenn Task alsOrdnungsgemäßbeendetmarkiertwerdensoll ThrowIfCancellationRequestedaufrufenwenn Task als Cancelled markiertwerdensoll Callback Methode Wirdausgeführtwenn Token gecancelledwird Wait Handle Triggertwenn Token gecancelledwird
Exception Handling AggregateExceptionwirdgeworfenwenneineodermehrere Exceptions auftreten Wird an den Thread geleitet der auf den Task joint bzw das Ergebnisabruft Task istCancelled wennOperationCancelledExceptiongeworfenwurde Task ist Faulted wennandere Exceptions geworfenwurden Wichtig! Just My Code unterDebugoptionendeaktivieren
Die Parallel Klasse BietetZugriff auf parallelisierteSchleifenund Regionen WichtigeMethoden Parallel.Invoke() Parallel.For() Parallel.ForEach()
Parallel.Invoke Leichtgewichtigste Tasking Art Wenig Code WenigKontrolle
Parallel.For Ersetztdas for Schlüsselwort GibtParallelLoopResultzurück EnthältInformationenüber die letzte Iteration etc.
EinfacheParallel.ForSchleife Zählerendwert Zählerstartwert Zählervariable Parallel.For(0, 100, (i) =>                 { Console.WriteLine(i); DoStuff();                 });
Schleifenabbrechen ParallelLoopStateliefert die Methoden Stop()  Bricht die Iteration so schnellwiemöglichab Break() WartetbisalleIterationen in allen Threads vor der aktuellenIterationenabgeschlossensind und bricht die Iteration dannab, RückgabewertParallelLoopResultliefertInformationenüber das Resultat der Schleife
ErweiterteParallel.ForSchleife Rückgabewert Rückgabewert ParallelLoopResultForResult = Parallel.For(0, 100, (i, LoopState) =>                 { Console.WriteLine(i); DoStuff(); if (i > 20)                     { LoopState.Break();                     }                 }); if (!ForResult.IsCompleted)             { Console.WriteLine(ForResult.LowestBreakIteration);             } ParallelLoopState Iteration Abbrechen Ergebnis abfragen
Parallel.ForEach ParallelesÄquivalentzurforeachSchleife VerwendungwieParallel.ForSchleife
EinfacheParallel.ForEachSchleife List<string> Books = newList<string>{"Die Kreutzersonate", "Anna Karenina", "Krieg und Frieden", "Der Tod des Ivan Illitsch", "Herr und Knecht"};     Parallel.ForEach<string>(Books, (Element) =>     { Console.WriteLine(Element); }); Iterationselement Collection
Von LINQ zu PLINQ LINQ – Language Integrated Query CodekomponentezurAbfrage von Datenquellen PLINQ – Parallel Language Integrated Query Erweiterung des LINQ Befehlssatzes um paralleleElemente
ParallelEnumerableKlasse AsParallel() Einstiegspunktfür PLINQ Legt fest dass der Rest des Querysparallelisiertausgeführtwerdensoll AsSequential() Legt fest dass der Rest des Queryssequentiellausgeführtwerdensoll
Einfacher PLINQ Query Zahlen von 1 bis 10000 var source = Enumerable.Range(1, 10000);   varsmallerfiftynumbers = from number insource.AsParallel() where number < 50 select number; Parallele Bearbeitung
Reihenfolge & PLINQ Aufgrund von Parallelitätist die Reihenfolgenichtgewährleistet AbhilfeschafftAsOrdered() Verarbeitet parallel Buffert und sortiertEinträge um ursprünglicheReihenfolgezuwahren
PLINQ Abbruch AsParallel().WithCancellation(CancellationToken)  Bricht den Query abwenn das Token ein Cancel Signal erhält
DatenstrukturenfürparalleleProgrammierung Thread-safe, scalable collections IProducerConsumerCollection<T> ConcurrentQueue<T> ConcurrentStack<T> ConcurrentBag<T> ConcurrentDictionary<TKey,TValue> Phases and work exchange Barrier  BlockingCollection<T> CountdownEvent Partitioning {Orderable}Partitioner<T> Partitioner.Create Exception handling AggregateException Initialization Lazy<T> LazyInitializer.EnsureInitialized<T> ThreadLocal<T> Locks ManualResetEventSlim SemaphoreSlim SpinLock SpinWait Cancellation CancellationToken{Source}
Visual Studio 2010 & ParalleleProgrammierung Multithread Debugging früherlästig und umständlich Mit Visual Studio 2010 gibtes Debug Fenster ParalleleAufgaben ParalleleStapel Profiling von Multithread Anwendungenmöglich Concurrency Visualizer
ParalleleAufgaben Ähnlichwie Threads Fenster Listet Tasks statt Threads auf
Parallele Stacks ZeigtAbhängigkeitenzwischen Threads Thread oder Task Darstellung

More Related Content

What's hot

Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003Brigitte Jellinek
 
Devs@Home - Einführung in Go
Devs@Home - Einführung in GoDevs@Home - Einführung in Go
Devs@Home - Einführung in GoFrank Müller
 
Was ist neu in Java 6, 7, 8, ...
Was ist neu in Java 6, 7, 8, ...Was ist neu in Java 6, 7, 8, ...
Was ist neu in Java 6, 7, 8, ...Andreas Schreiber
 
Spaß an der Nebenläufigkeit
Spaß an der NebenläufigkeitSpaß an der Nebenläufigkeit
Spaß an der NebenläufigkeitFrank Müller
 
Upgrading Puppet CommitterConf Essen 2014
Upgrading Puppet CommitterConf Essen 2014Upgrading Puppet CommitterConf Essen 2014
Upgrading Puppet CommitterConf Essen 2014Martin Alfke
 
Coffee Backone Introduction
Coffee Backone IntroductionCoffee Backone Introduction
Coffee Backone IntroductionTino Isnich
 

What's hot (6)

Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
 
Devs@Home - Einführung in Go
Devs@Home - Einführung in GoDevs@Home - Einführung in Go
Devs@Home - Einführung in Go
 
Was ist neu in Java 6, 7, 8, ...
Was ist neu in Java 6, 7, 8, ...Was ist neu in Java 6, 7, 8, ...
Was ist neu in Java 6, 7, 8, ...
 
Spaß an der Nebenläufigkeit
Spaß an der NebenläufigkeitSpaß an der Nebenläufigkeit
Spaß an der Nebenläufigkeit
 
Upgrading Puppet CommitterConf Essen 2014
Upgrading Puppet CommitterConf Essen 2014Upgrading Puppet CommitterConf Essen 2014
Upgrading Puppet CommitterConf Essen 2014
 
Coffee Backone Introduction
Coffee Backone IntroductionCoffee Backone Introduction
Coffee Backone Introduction
 

Similar to Parallele Softwareentwicklung mit .NET 4.0

Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeFrank Müller
 
Übungsaufgaben
ÜbungsaufgabenÜbungsaufgaben
Übungsaufgabenmaikinger
 
Einführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungEinführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungDigicomp Academy AG
 
Java Streams und Lambdas
Java Streams und LambdasJava Streams und Lambdas
Java Streams und LambdasNane Kratzke
 
2006 - NRW Conf: Asynchronous asp.net
2006 - NRW Conf: Asynchronous asp.net2006 - NRW Conf: Asynchronous asp.net
2006 - NRW Conf: Asynchronous asp.netDaniel Fisher
 
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und GroovyLeichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und GroovyThorsten Kamann
 
Funktionales Programmieren mit Clojure
Funktionales Programmieren mit ClojureFunktionales Programmieren mit Clojure
Funktionales Programmieren mit ClojureDr. Christian Betz
 
Tech Talk: Pyparsing
Tech Talk: PyparsingTech Talk: Pyparsing
Tech Talk: Pyparsingschlauch
 
Skalierbare Anwendungen mit Google Go
Skalierbare Anwendungen mit Google GoSkalierbare Anwendungen mit Google Go
Skalierbare Anwendungen mit Google GoFrank Müller
 
Funktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit SodiumFunktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit SodiumTorsten Fink
 
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins Christian Kauhaus
 
Dart (Teil I der Tour de Dart)
Dart (Teil I der Tour de Dart)Dart (Teil I der Tour de Dart)
Dart (Teil I der Tour de Dart)Nane Kratzke
 
Enterprise Java Batch mit Spring
Enterprise Java Batch mit SpringEnterprise Java Batch mit Spring
Enterprise Java Batch mit Springdenschu
 
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScriptManfred Steyer
 

Similar to Parallele Softwareentwicklung mit .NET 4.0 (20)

Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare Systeme
 
Übungsaufgaben
ÜbungsaufgabenÜbungsaufgaben
Übungsaufgaben
 
Einführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungEinführung in die funktionale Programmierung
Einführung in die funktionale Programmierung
 
Java Streams und Lambdas
Java Streams und LambdasJava Streams und Lambdas
Java Streams und Lambdas
 
2006 - NRW Conf: Asynchronous asp.net
2006 - NRW Conf: Asynchronous asp.net2006 - NRW Conf: Asynchronous asp.net
2006 - NRW Conf: Asynchronous asp.net
 
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und GroovyLeichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
 
Funktionales Programmieren mit Clojure
Funktionales Programmieren mit ClojureFunktionales Programmieren mit Clojure
Funktionales Programmieren mit Clojure
 
Pyparsing
PyparsingPyparsing
Pyparsing
 
jQuery & CouchDB - Die zukünftige Webentwicklung?
jQuery & CouchDB - Die zukünftige Webentwicklung?jQuery & CouchDB - Die zukünftige Webentwicklung?
jQuery & CouchDB - Die zukünftige Webentwicklung?
 
Tech Talk: Pyparsing
Tech Talk: PyparsingTech Talk: Pyparsing
Tech Talk: Pyparsing
 
Ruby on Rails SS09 04
Ruby on Rails SS09 04Ruby on Rails SS09 04
Ruby on Rails SS09 04
 
Skalierbare Anwendungen mit Google Go
Skalierbare Anwendungen mit Google GoSkalierbare Anwendungen mit Google Go
Skalierbare Anwendungen mit Google Go
 
Funktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit SodiumFunktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit Sodium
 
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
 
Dart (Teil I der Tour de Dart)
Dart (Teil I der Tour de Dart)Dart (Teil I der Tour de Dart)
Dart (Teil I der Tour de Dart)
 
Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1
 
Enterprise Java Batch mit Spring
Enterprise Java Batch mit SpringEnterprise Java Batch mit Spring
Enterprise Java Batch mit Spring
 
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
 
VampirTrace und Vampir
VampirTrace und VampirVampirTrace und Vampir
VampirTrace und Vampir
 
BIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen I
BIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen IBIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen I
BIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen I
 

More from Qiong Wu

node.js workshop- node.js databases
node.js workshop- node.js databasesnode.js workshop- node.js databases
node.js workshop- node.js databasesQiong Wu
 
node.js workshop- node.js unit testing
node.js workshop- node.js unit testingnode.js workshop- node.js unit testing
node.js workshop- node.js unit testingQiong Wu
 
node.js workshop- node.js middleware
node.js workshop- node.js middlewarenode.js workshop- node.js middleware
node.js workshop- node.js middlewareQiong Wu
 
node.js workshop- node.js basics
node.js workshop- node.js basicsnode.js workshop- node.js basics
node.js workshop- node.js basicsQiong Wu
 
node.js workshop- JavaScript Async
node.js workshop- JavaScript Asyncnode.js workshop- JavaScript Async
node.js workshop- JavaScript AsyncQiong Wu
 
node.js workshop- JavaScript Basics
node.js workshop- JavaScript Basicsnode.js workshop- JavaScript Basics
node.js workshop- JavaScript BasicsQiong Wu
 
S N A I L Final Presentation
S N A I L    Final  PresentationS N A I L    Final  Presentation
S N A I L Final PresentationQiong Wu
 
3 Interop Part2
3 Interop Part23 Interop Part2
3 Interop Part2Qiong Wu
 
C# Workshop - File Operations
C# Workshop - File OperationsC# Workshop - File Operations
C# Workshop - File OperationsQiong Wu
 
C# Workshop - Networking
C# Workshop - NetworkingC# Workshop - Networking
C# Workshop - NetworkingQiong Wu
 
Life In Power Point
Life In Power PointLife In Power Point
Life In Power PointQiong Wu
 

More from Qiong Wu (13)

node.js workshop- node.js databases
node.js workshop- node.js databasesnode.js workshop- node.js databases
node.js workshop- node.js databases
 
node.js workshop- node.js unit testing
node.js workshop- node.js unit testingnode.js workshop- node.js unit testing
node.js workshop- node.js unit testing
 
node.js workshop- node.js middleware
node.js workshop- node.js middlewarenode.js workshop- node.js middleware
node.js workshop- node.js middleware
 
node.js workshop- node.js basics
node.js workshop- node.js basicsnode.js workshop- node.js basics
node.js workshop- node.js basics
 
node.js workshop- JavaScript Async
node.js workshop- JavaScript Asyncnode.js workshop- JavaScript Async
node.js workshop- JavaScript Async
 
node.js workshop- JavaScript Basics
node.js workshop- JavaScript Basicsnode.js workshop- JavaScript Basics
node.js workshop- JavaScript Basics
 
S N A I L Final Presentation
S N A I L    Final  PresentationS N A I L    Final  Presentation
S N A I L Final Presentation
 
3 Interop Part2
3 Interop Part23 Interop Part2
3 Interop Part2
 
Kickoff
KickoffKickoff
Kickoff
 
2 Interop
2 Interop2 Interop
2 Interop
 
C# Workshop - File Operations
C# Workshop - File OperationsC# Workshop - File Operations
C# Workshop - File Operations
 
C# Workshop - Networking
C# Workshop - NetworkingC# Workshop - Networking
C# Workshop - Networking
 
Life In Power Point
Life In Power PointLife In Power Point
Life In Power Point
 

Parallele Softwareentwicklung mit .NET 4.0

  • 1. Parallele Softwareentwicklung mit .NET 4.0 Vorteile & Neuerungen und Einsatzmöglichkeiten der Parallel Extensions
  • 2. Was istparalleleProgrammierung? AufteilungeinerAufgabe in Teilaufgaben die parallel bearbeitetwerden Machtsich die RechenkraftmehrererProzessoren / Cores zunutzen
  • 3. WozuparalleleProgrammierung? Single Core Systeme User Interface nichtblockieren AsynchroneOperationen Synchronisation
  • 4. WozuparalleleProgrammierung? Server skalierenschonmit Multi-CPU User Systemebesitzen Multi-Core Ressourcenmüssengenutztwerden
  • 6. ParalleleProgrammierung – vor .NET 4.0 Synchrones & Asynchrones Threading Nachteil Thread Overhead ThreadPool Geeignetfür Fire and Forget Einmalgestartete Threads könnennichtkontrolliertwerden Nachteile Warten Abbruch Weitermachen Debugging Etc.
  • 7. Von Threads zu Tasks Threads und Tasks sindsehrähnlich Threads erlaubenparalleleAusführunginnerhalbeinesProzesses Symbolisch die Arbeiter des Prozesses Tasks basieren auf Threads Symbolisch die Arbeit die den Arbeiternaufgetragenwird Mit der Task Parallel Library in .NET 4.0 eingeführt
  • 8.
  • 9.
  • 11.
  • 12. Der Action/Func Delegate BeinhalteteineMethode die keinenRückgabewertbesitzt Kannmehrere Parameter besitzen
  • 13. Task ohne Parameter und Rückgabewert staticvoid Main(string[] args) { Action Action1 = newAction(Compute); Task Task1 = newTask(Action1); Task1.Start(); } staticvoid Compute() { Console.WriteLine("Computing..."); System.Threading.Thread.Sleep(1000); Console.WriteLine("Computing finished..."); } Action Delegat Action dem Task Objekt zuweisen Task Starten
  • 14. Task mit Parameter und ohneRückgabewert Action Delegat mit Parameter vom Typ object staticvoid Main(string[] args) { Action<object> Action1 = newAction<object>(Compute); Task Task1 = newTask(Action1, "Parameter 1"); Task1.Start(); } staticvoid Compute(object Parameter) { Console.WriteLine("Computing with Parameter " + Parameter + "..."); System.Threading.Thread.Sleep(1000); Console.WriteLine("Computing finished..."); } Action dem Task Objekt zuweisen & Parameter übrgeben Parameter verarbeiten
  • 15. Task ohne Parameter mitRückgabewert Func dem Task mit Rückgabetyp string zuweisen Func Delegat mit Rückgabetyp string staticvoid Main(string[] args) { Func<string> Func1 = newFunc<string>(Compute); Task<string> Task1 = newTask<string>(Func1); Task1.Start(); Console.WriteLine("Result was " + Task1.Result); } staticstring Compute() { Console.WriteLine("Computing..."); System.Threading.Thread.Sleep(1000); Console.WriteLine("Computing finished..."); return"Result"; } Rückgabewert abrufen Passende Signatur Wert zurückgeben
  • 16. Task mit Parameter und Rückgabewert Func Delegat mit Rückgabetyp string und Parameter object staticvoid Main(string[] args) { Func<object, string> Func1 = newFunc<object, string>(Compute); Task<string> Task1 = newTask<string>(Func1, "Parameter1"); Task1.Start(); Console.WriteLine("Result was " + Task1.Result); } staticstring Compute(object Parameter) { Console.WriteLine("Computing with Parameter " + Parameter + "..."); System.Threading.Thread.Sleep(1000); Console.WriteLine("Computing finished..."); return"Result"; } Func dem Task mit Rückgabetyp string zuweisen & Parameter übergeben
  • 17. Lambda Ausdrücke BildenanonymeFunktion die Ausdrücke und Anweisungenenthält Syntax WichtigeOperatoren => “wirdzu” () definiertEingangsparameter {} umschließteineReihe von Anweisungen Werden oft zusammenmit LINQ verwendet Wichtig Lambda Expressions können auf Variablen der einschließendenMethode / Typzugreifen
  • 18. Lambda Ausdrücke Delegat zum speichern der Anonymen Funktion Lambda Ausdruck x wird zu x * x delegateintdel(int i); staticvoid Main(string[] args) { delmyDelegate = x => x * x; int j = myDelegate(5); //j = 25 } Aufruf der Anonymen Funktion mittels Delegat
  • 19. TaskCreationOptions BietetOptionenfür die Behandlung des Tasks durch den Taskmanager None PreferFairness LongRunning AttachedToParent
  • 20. Task Abbruch EinheiklesThemamit Multithreading Ziele Wahren von Teilergebnissen Vermeiden von HolzhammerwieThread.Abort Zuverlässige und sichereAbbruchmethode Tasks werdendurchCancellationTokenbeendet Abbruchwird von CancellactionSourceangefordert, abernichtunbedingtsofortausgeführt GewährleistetsicheresAbbrechen von Tasks ImwesentlichenwieAbortvariable
  • 21. CancellationSource BeinhaltetCancellationToken Threadsicherevom Framework zurVerfügunggestellteAbortvariable Wirdfür Tasks verwendet, kannaberauchfürkonventionelles Threading benutztwerden Aufruf von CancellationSource.CancelsetztCancellationToken.IsCancellationRequested auf true (irreversibel)
  • 22. CancellationToken MehrereMöglichkeiten auf Cancel Request zureagieren Polling RegelmäßigIsCancellationRequestedüberprüfenwenn Task alsOrdnungsgemäßbeendetmarkiertwerdensoll ThrowIfCancellationRequestedaufrufenwenn Task als Cancelled markiertwerdensoll Callback Methode Wirdausgeführtwenn Token gecancelledwird Wait Handle Triggertwenn Token gecancelledwird
  • 23. Exception Handling AggregateExceptionwirdgeworfenwenneineodermehrere Exceptions auftreten Wird an den Thread geleitet der auf den Task joint bzw das Ergebnisabruft Task istCancelled wennOperationCancelledExceptiongeworfenwurde Task ist Faulted wennandere Exceptions geworfenwurden Wichtig! Just My Code unterDebugoptionendeaktivieren
  • 24. Die Parallel Klasse BietetZugriff auf parallelisierteSchleifenund Regionen WichtigeMethoden Parallel.Invoke() Parallel.For() Parallel.ForEach()
  • 25. Parallel.Invoke Leichtgewichtigste Tasking Art Wenig Code WenigKontrolle
  • 26. Parallel.For Ersetztdas for Schlüsselwort GibtParallelLoopResultzurück EnthältInformationenüber die letzte Iteration etc.
  • 27. EinfacheParallel.ForSchleife Zählerendwert Zählerstartwert Zählervariable Parallel.For(0, 100, (i) => { Console.WriteLine(i); DoStuff(); });
  • 28. Schleifenabbrechen ParallelLoopStateliefert die Methoden Stop() Bricht die Iteration so schnellwiemöglichab Break() WartetbisalleIterationen in allen Threads vor der aktuellenIterationenabgeschlossensind und bricht die Iteration dannab, RückgabewertParallelLoopResultliefertInformationenüber das Resultat der Schleife
  • 29. ErweiterteParallel.ForSchleife Rückgabewert Rückgabewert ParallelLoopResultForResult = Parallel.For(0, 100, (i, LoopState) => { Console.WriteLine(i); DoStuff(); if (i > 20) { LoopState.Break(); } }); if (!ForResult.IsCompleted) { Console.WriteLine(ForResult.LowestBreakIteration); } ParallelLoopState Iteration Abbrechen Ergebnis abfragen
  • 31. EinfacheParallel.ForEachSchleife List<string> Books = newList<string>{"Die Kreutzersonate", "Anna Karenina", "Krieg und Frieden", "Der Tod des Ivan Illitsch", "Herr und Knecht"};     Parallel.ForEach<string>(Books, (Element) => { Console.WriteLine(Element); }); Iterationselement Collection
  • 32. Von LINQ zu PLINQ LINQ – Language Integrated Query CodekomponentezurAbfrage von Datenquellen PLINQ – Parallel Language Integrated Query Erweiterung des LINQ Befehlssatzes um paralleleElemente
  • 33. ParallelEnumerableKlasse AsParallel() Einstiegspunktfür PLINQ Legt fest dass der Rest des Querysparallelisiertausgeführtwerdensoll AsSequential() Legt fest dass der Rest des Queryssequentiellausgeführtwerdensoll
  • 34. Einfacher PLINQ Query Zahlen von 1 bis 10000 var source = Enumerable.Range(1, 10000);   varsmallerfiftynumbers = from number insource.AsParallel() where number < 50 select number; Parallele Bearbeitung
  • 35. Reihenfolge & PLINQ Aufgrund von Parallelitätist die Reihenfolgenichtgewährleistet AbhilfeschafftAsOrdered() Verarbeitet parallel Buffert und sortiertEinträge um ursprünglicheReihenfolgezuwahren
  • 36. PLINQ Abbruch AsParallel().WithCancellation(CancellationToken) Bricht den Query abwenn das Token ein Cancel Signal erhält
  • 37. DatenstrukturenfürparalleleProgrammierung Thread-safe, scalable collections IProducerConsumerCollection<T> ConcurrentQueue<T> ConcurrentStack<T> ConcurrentBag<T> ConcurrentDictionary<TKey,TValue> Phases and work exchange Barrier BlockingCollection<T> CountdownEvent Partitioning {Orderable}Partitioner<T> Partitioner.Create Exception handling AggregateException Initialization Lazy<T> LazyInitializer.EnsureInitialized<T> ThreadLocal<T> Locks ManualResetEventSlim SemaphoreSlim SpinLock SpinWait Cancellation CancellationToken{Source}
  • 38. Visual Studio 2010 & ParalleleProgrammierung Multithread Debugging früherlästig und umständlich Mit Visual Studio 2010 gibtes Debug Fenster ParalleleAufgaben ParalleleStapel Profiling von Multithread Anwendungenmöglich Concurrency Visualizer
  • 39. ParalleleAufgaben Ähnlichwie Threads Fenster Listet Tasks statt Threads auf
  • 40. Parallele Stacks ZeigtAbhängigkeitenzwischen Threads Thread oder Task Darstellung
  • 41. Vielen Dank für die Aufmerksamkeit! Qiong Wu qiong.wu@studentpartners.de