Projektowanie i Konstrukcja Systemów Rozproszonych. Wykład 2 Podstawy środowiska i współbieżność w.net



Podobne dokumenty
C# 6.0 : kompletny przewodnik dla praktyków / Mark Michaelis, Eric Lippert. Gliwice, cop Spis treści

Programowanie Komputerów

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Podstawy programowania. Wprowadzenie

Microsoft IT Academy kurs programowania

Programowanie w środowiskach graficznych. Wykład 3 Język C#

Metodyka programowania. Podstawy C#

msgbox("akcja: Początek, argument: " + argument.tostring()); Thread.Sleep(1000); //opóźnienie msgbox("akcja: Koniec"); return DateTime.Now.

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Spis treści. oraz Microsoft Visual Studio Wstęp... xiii. Część I Wprowadzenie do języka Microsoft Visual C# 1 Wprowadzenie do języka C#...

Programowanie obiektowe

Programowanie w środowiskach graficznych. Wykład 4 Język C# cd

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Poznaj ASP.NET MVC. Kamil Cieślak Microsoft Student Partner

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Języki i metodyka programowania. Język C# pętle, sterowanie, wyjątki

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Programowanie obiektowe

Rys. 1. Struktura środowiska.net 3.5. S. Fraser, Pro Visual C++/CLI and the.net 3.5 Platform, Apress, 2009.

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Monitory. Jarosław Kuchta

Współbieżność w środowisku Java

C# - innowacja czy plagiat?

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Cena szkolenia. Opis kursu

Wykład 5 Okna MDI i SDI, dziedziczenie

Programowanie obiektowe

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Programowanie obiektowe

Materiały do zajęć VII

Java. Programowanie Obiektowe Mateusz Cicheński

Co to jest klasa? Z programistycznego punktu widzenia klasa stanowi typ danych, który odwzorowuje wspólne cechy jakiegoś obiektu.

Klasy cd. Struktury Interfejsy Wyjątki

Programowanie MorphX Ax

Język Java wątki (streszczenie)

Programowanie.NET - kurs zaawansowany

Załącznik nr 1 do zapytania ofertowego nr 1/POKL/2015

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

C# Threading. Obliczenia Równoległe i Systemy Rozproszone Kryspin Mirota,

Dawid Gierszewski Adam Hanasko

Microsoft Visual C# 2012 Krok po kroku

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Programowanie obiektowe

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003

Programowanie równoległe i rozproszone. Monitory i zmienne warunku. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Programuj w języku C# i zarabiaj na swoich aplikacjach! Programowanie w Visual Studio 2013 to czysta przyjemność!

VISUAL STUDIO 2008 I.NET 3.5 NOWOŚCI. Bartłomiej Filipek

Spis treści. Wprowadzenie 15

Dziedziczenie. dr Jarosław Skaruz

Programowanie obiektowe

Instrukcja laboratoryjna nr.4

Programowanie obiektowe

Polimorfizm. dr Jarosław Skaruz

.NET Klasy, obiekty. ciąg dalszy

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

1 Atrybuty i metody klasowe

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

C# 6.0 w pigułce / Joseph Albahari, Ben Albahari. Gliwice, cop Spis treści

Plan wykładu. Tworzenie programów dla platformy.net. Predefiniowane typy C# Pierwszy program. Typy wartości i typy referencyjne

Programowanie obiektowe

Dokumentacja do API Javy.

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Programowanie współbieżne Zadanie 5 - Podstawowe problemy programowania współbieżnego

Programowanie Współbieżne

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Programowanie obiektowe

Programowanie obiektowe i zdarzeniowe

Podstawy programowania. Programowanie obiektowe

Wykłady 1, 2. Wstęp do programowania w środowisku Visual C++ Autor: Zofia Kruczkiewicz

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Platformy Programistyczne Podstawy języka Java

C# /.NET. Copyright by 3bird Projects 2018,

Kurs programowania. Wykład 9. Wojciech Macyna

Programowanie wielowątkowe. Jarosław Kuchta

Programowanie równoległe i asynchroniczne w C# 5.0 / Mateusz Warczak [et al.]. Gliwice, cop Spis treści

Ekspert radzi. mechanizm w enova, umożliwiający wskazanie domyślnej drukarki dla danego stanowiska i wydruku. Strona 1 z 8. Ekspert radzi.

Rok akademicki: 2012/2013 Kod: ZIE s Punkty ECTS: 3. Poziom studiów: Studia I stopnia Forma i tryb studiów: -

Programowanie obiektowe

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Programowanie obiektowe

PARADYGMATY PROGRAMOWANIA Wykład 4

Enkapsulacja, dziedziczenie, polimorfizm

Programowanie komputerów

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Programowanie Obiektowe Ćwiczenie 4

Metodyka programowania. Podstawy C#

1. Klasa typu sealed. Przykład 1. sealed class Standard{ class NowyStandard:Standard{ // błd!!!

Signals + Threads: Qt vs. Boost

Wstęp do ruby dla programistów javy

Programowanie równoległe i rozproszone. W1. Wielowątkowość. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Język C++ wykład VIII

Podstawy programowania obiektowego

Modelowanie numeryczne w fizyce atmosfery Ćwiczenia 3

Transkrypt:

Projektowanie i Konstrukcja Systemów Rozproszonych Wykład 2 Podstawy środowiska i współbieżność w.net 1

Co to jest.net? Rozwiązanie kompleksowe języki programowania C#, VB.NET, J#, MC++,... środowisko uruchomieniowe zbiór bibliotek narzędzia programistyczne wieloprocesorowe (i wielosystemowe) objęte standardami ECMA* i ISO *ECMA przykładowa komisja standaryzująca MS OOXML Przewodniczący: Mr. J. Paoli (Microsoft) Mrs. I. Valet-Harper (Microsoft) Vice-przewodniczący: Mr. A. Farquhar (British Library) Sekretarz: Dr. Istvan Sebestyen (Ecma) 2

Co to jest.net? (2) źródło: projekt mono / Miguel de Icaza 3

Historia dlaczego.net? lipiec 2000 Microsoft, Hewlett-Packard i Intel opracowują standardy CLI i języka C# grudzień 2001 standaryzacja przez ECMA jako ECMA-334 (C#) oraz ECMA-335 (CLI) kwiecień 2003 standaryzacja przez ISO jako ISO/IEC 23270 (C#) i ISO/IEC 23271 (CLI) 4

Historia (2) Wersje framework MS.NET Framework 1.0 (C# 1, CLR/BCL v1.0) 01.2002, MS.NET Framework 1.1 (C# 1, CLR/BCL v1.1) i Compact Framework 1.0 04.2003 MS.NET Framework 2.0 (C# 2, CLR/BCL v2.0) i Micro Framework 11.2005, MS.NET Framework 3.0 (C# 2, CLR/BCL v2.0) 11.2006 Windows Presentation Foundation (WPF, Avalone), Windows Communication Foundation (WCF, Indigo), Windows Workflow Foundation (WF), Windows CardSpace (WCS, InfoCard ) 5

Historia (3) Dział marketingu Wersje framework MS.NET Framework 3.5 11.2007.NET Framework 2.0 SP1 C# 2, CLR/BCL v2.0 SP1.NET Framework 3.0 SP1 C# 2, CLR/BCL v2.0 SP1 + WCF, WPF, WCS, WF.NET Framework 3.5 C# 3,.NET 3.0 SP1, LINQ MS.NET Framework 3.5 SP1 08.2008.NET Framework 2.0 SP2 C# 2, CLR/BCL v2.0 SP2.NET Framework 3.0 SP2 C# 2, CLR/BCL v2.0 SP2 + WCF, WPF, WCS, WF.NET 3.5 SP1 C# 3,.NET 3.0 SP2, LINQ, EF, MVC.NET 3.5 SP1 + GDR MS.NET Framework 4.0 C# 4, 04.2010 (CLR 4.0) MS.NET Framework 4.5 C# 5, 08.2012 (CLR 4.5); 4.5.1 VS2013 6

Architektura 7

Historia (4) Inne framework'i mono (http://www.mono-project.com) 6.2001 ogłoszenie projektu przez Miguela de Icaza 5.2004 mono 1.0 (MS.NET Framework 1.1) 10.2006 mono 1.2 (MS.NET 1.1 z MWF,.NET 2.0) 09.2008 mono 2.0 (C# 3.0, MWF 2.0) 03.2009 mono 2.4 (Mono.SIMD) 12.2009 mono 2.6 (moonlight, soft debugger, profil 4.0) 10.2010 mono 2.8 (sgen, profil 4.0, C# 4.0, WCF, ASP MVC 2) 02.2011 mono 2.10 (sgen, nowy kompilator i profiler) 10.2012 mono 3.0 (c# 5, async) 07.2013 mono 3.2 8

Specyfika środowiska kod zarządzany zarządzanie pamięcią i Garbage Collector budowa aplikacji assembly = kod pośredni + manifest -> dll, exe, kompilacja Just-in-Time cache bibliotek GAC, konfiguracja bibliotek reflection API 9

Języki w MS.NET dostępne: C#, VB.NET, MC++ w innych projektach: Java, Nemerle, Boo,... DLR (Dynamic Language Runtime) Python, JavaScript (EcmaScript 3.0), Visual Basic, Ruby, F# zalecany C# stworzony pod platformę naturalna składnia bardzo podobny do języka Java aktualnie wersja 5.0 języka (z Framework 4.5) 10

Programowanie w.net (1) Typy danych proste i referencyjne struktury i klasy Definicja klasy public class Demo1 { public Demo1 () { public ~Demo1 () { public void Add1 (int x, int y) { y += x public void Add2 (int x, ref int y) {y += x public void Add3 (int x, out int y) {y = x 11

Programowanie w.net (2) Parametry domyślnie przez (kopiowaną) referencję, out przekazanie wyniku na zewnątrz, ref wymuszenie przekazania przez referencję, Poziomy dostępu public protected private internal protected internal 12

Programowanie w.net (3) Składowe klasy pola, metody, konstruktory/destruktory właściwości public int Sthing { get { return m_sth; set { m_sth = value; delegacje zdarzenia atrybuty 13

Programowanie w.net (4) Składowe klasy statyczne public class X {public static int m_x = 1; stałe public class Y {public const int PI = 3.1; składowe sealed public sealed class Y {int PI = 3.1; klasa nie można z niej dziedziczyć, metoda nie może być przeciążona, każda struktura jest sealed 14

Programowanie w.net (5) Wyliczenia public enum ProjLevel : byte { Lite = 0x01, Normal = 0x02 Rzutowanie as rzutuj i zwróć referencję nowego typu Cat c = animal as Cat; //can be null is sprawdź, czy rzutowanie możliwe (bool) if (animal is Cat) {... 15

Programowanie w.net (6) Delegacje odpowiedniki wskaźników na metodę public delegate string FancyStringDel (int x); public string ConvOne (int val) {... public void Method () { FancyStringDel del = new FancyDelString (ConvOne); del (2); 16

Programowanie w.net (7) Zdarzenia komunikacja wiele-wiele między klasami public delegate void CalcDel (int x); public event CalcDel CalculationDone; CalculationDone (3);... CalculationDone += new CalcDel (ShowRes); CalculationDone = new CalcDel (ShowRes); 17

Programowanie w.net (8) Dziedziczenie tylko publiczne class Truck : Vehicle { void GoTo (string s) {... void GoTo (Point p) { Pojedyncze dziedziczenie Przeciążanie metod i operatorów public static Point operator+ (Point p, int dx, int dy) {... 18

Programowanie w.net (9) Przesłanianie i ukrywanie metod public class Car { public virtual double GetMaxSpeed (...); public bool Stopped (...); Przesłanianie i ukrywanie metod (cd) public class SportCar : IComparable, Car { public override double GetMaxSpeed (...); public new string Stopped (...); 19

Programowanie w.net (10) Klasa bazowa składowa base Klasa abstrakcyjna modyfikator abstract System.ApplicationException try / catch / finally / throw 20

Programowanie w.net (11) Atrybuty [AttributeUsage(AttributeTargets.All)] public class AuthInfo : System.Attribute {... public AuthInfo(string name) {... [AuthInfo( Bono )] public class AnyClass {...... MemberInfo mi = typeof(anyclass); object [] atts = mi. GetCustomAttributes(typeof(AuthInfo),true); 21

Programowanie w.net C# 2.0 Metody anonimowe button1.click += delegate(object s, EventArgs e) { MessageBox.Show("You clicked the button ); ; Iteratory public class Colors { public string R, G, B; public IEnumerator<string> GetEnumerator() { yield return R; yield return G; yield return B; foreach (String s in Colors) {... 23

Programowanie w.net C# 2.0 (2) klasy częściowe public partial class PartialClass {... operator?? generics tworzenie klas, metod, struktur z nieznanym, ale ustalanym i sprawdzanym w czasie kompilacji typem idea bazująca na templates z C++ Nullable types: int? x = null 24

Programowanie w.net C# 2.0 (3) generics public class Dictionary<K,V> { public void Add(K key, V value) {... if (((IComparable)key).CompareTo(x) < 0) {... // błąd, typ K nie zawiera CompareTo (object O) public class Dictionary<K,V> where K : IComparable 25

Zmiany w.net 3.0 brak zmian w języku i podstawowych bibliotekach dodanie zestawy bibliotek WinFX Windows Communication Foundation Windows Presentation Foundation Windows Workflow Foundation Windows CardSpace 26

C# 3.0, (.NET Framework 3.5) zmienne typowane implicite var orders = new Dictionary<int,Order>(); metody rozszerzające (extension methods) public static T[] Slice<T>(this T[] source, int index, int count){ if (index < 0 count < 0 source.length index < count) throw new ArgumentException(); T[] result = new T[count]; Array.Copy(source, index, result, 0, count); return result;... int[] digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9; int[] a = digits.slice(4, 3); 27

C# 3.0 (2) wyrażenia lambda (lambda expressions) rozszerzenie metod anonimowych x => x + 1 // Impl. typed, expr. body x => { return x + 1; (int x) => x + 1 // Impl. typed, statement body // Expl. typed, expr. body (int x) => { return x + 1; // Expl. typed, statement body (x, y) => x * y // Multiple parameters () => Console.WriteLine() // No parameters delegate R Func<A,R>(A arg); delegate void Action<T> (T obj); Func<int,int> f1 = x => x + 1; Func<int,double> f2 = x => x + 1; Func<double,int> f3 = x => x + 1; // Ok // Ok // Error 28

C# 3.0 (3) wyrażenia lambda przykład class ItemList<T>: List<T> { public int Sum(Func<T,int> selector) { int sum = 0; foreach (T item in this) sum += selector(item); return sum;... void ComputeSums() { ItemList<Detail> orderdetails = GetOrderDetails(...); int totalunits = orderdetails.sum(d => d.unitcount);... 29

C# 3.0 (4) object initializers public class Rectangle { Point p1 = new Point(); Point p2 = new Point(); public Point P1 { get { return p1; public Point P2 { get { return p2; var r = new Rectangle { P1 = { X = 0, Y = 1, P2 = { X = 2, Y = 3 ; typy anonimowe var p1 = new { Name = "Lawnmower", Price = 495.00 ; var p2 = new { Name = "Shovel", Price = 26.95 ; p1 = p2; // OK 30

C# 3.0 (5) LINQ:.NET Language-Integrated Query integracja z SQL i XML from c in customers where c.city == "London" select c // tłumaczone na: customers.where(c => c.city == "London") from c in customers where c.city == "London" from o in c.orders where o.orderdate.year == 2005 select new { c.name, o.orderid, o.total //tłumaczone na: customers.where(c => c.city == "London"). SelectMany(c => c.orders. Where(o => o.orderdate.year == 2005). Select(o => new { c.name, o.orderid, o.total ) ) 31

C# 4.0 (1) dynamic language runtime (DLR) wsparcie języków dynamicznych i skryptowych IronPython, IronRuby dynamic sprawdzanie typów w czasie uruchomienia wprowadzono krotki (tuples) klasa Tuple Tuple<string, Nullable<int>>[] scores = { new Tuple<string, Nullable<int>>("Jack", 78), new Tuple<string, Nullable<int>>("Abbey", 92),... wzorzec IObserver(T) i IObservable(T) 32

C# 4.0 (2) kowariancja i kontrawariancja dla typów ogólnych kowariancja class Base {... class Derived : Base { public static void Main() { IEnumerable<Base> newbase = new List<Derived>(); parametry nazwane i opcjonalne public void ExampleMethod(int required, string optionalstr = "default string", int optionalint = 10) {... anexample.examplemethod(3, optionalint: 4); 33

C# 4.0 (3) kowariancja i kontrawariancja dla typów ogólnych kontrawariancja void DoSomethingToAFrog(Action<Frog> action, Frog frog) {... action(frog); Action<Animal> feed = animal = >animal.feed(); DoSomethingToAFrog(feed, new Frog());... 34

C# 4.0 (4) Task Parallel Library i PLINQ Task Action<object> action = (object obj) => { Console.WriteLine("Task={0, obj={1, Thread={2", Task.CurrentId, obj.tostring(), Thread.CurrentThread.ManagedThreadId); ; Task t3 = new Task(action, "gamma"); t3.runsynchronously(); t3.wait(); PLINQ var source = Enumerable.Range(1, 10000); var evennums = from num in source.asparallel() where Compute(num) > 0 select num; 35

C# 5.0 (1) Metody async (za msdn.microsoft.com) async Task<int> AccessTheWebAsync() { Task<byte[]> geturltask = client.geturlasync("http://msdn.microsoft.com"); DoIndependentWork(); string urlcontents = await geturltask; return urlcontents.length; private async Task<byte[]> GetURLAsync(string url) { var content = new MemoryStream(); var webreq = (HttpWebRequest)WebRequest.Create(url); using (WebResponse response = await webreq.getresponseasync()) { using (Stream responsestream = response.getresponsestream()) { await responsestream.copytoasync(content); return content.toarray(); 36

C# 5.0 (2) Metody async (za msdn.microsoft.com) 37

C# 5.0 (3) Wiele mniejszych zmian dla programowania równoległego, np. TPL dataflow var items = new BufferBlock<T>( new DataflowBlockOptions { BoundedCapacity = 100 ); Task.Run(async delegate { while(true) { T item = Produce(); await items.sendasync(item); ; Task.Run(async delegate { while(true) { T item = await items.receiveasync(); Process(item); ); 38

Wątki i synchronizacja instrukcja lock, metody synchronized, kolekcje przestrzeń nazw System.Threading Thread ThreadPool Auto/ManualResetEvent Interlocked Mutex Monitor Semaphore ReaderWriterLock BackgroundWorker 39

Thread tworzy i kontroluje nowy wątek można zgubić referencję bez zabicia wątku delegacje ThreadStart, ParameterizedThreadStart Thread.CurrentThread Join (), Sleep (), VolitileRead (), VolitileWrite () Interrupt (), Abort() i wyjątki ThreadState, IsBackground public static void ThreadProc() {... Thread t = new Thread(new ThreadStart(ThreadProc)); t.start (); 40

ThreadPool często wątki przez dużą cześć czasu są w stanie Wait zbiór wątków, z których każdy monitoruje kilka operacji w stanie oczekiwania lub wykonuje krótkie zadania kiedy operacja staje się gotowa, 1 z wolnych wątków wykonuje funkcję zwrotną wszystkie wątki są background ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), object); ThreadPool.RegisterWaitForSingleObject ( WaitHandle, WaitOrTimerCallback, state, timeout, executeonlyonce); 41

Auto/ManualResetEvent Zdarzenie do komunikacji między wątkami Stan zdarzenia zamknięte/otwarte, stan jest pamiętany Wywołanie WaitOne () oczekiwanie na zdarzenie AutoResetEvent wywołanie Set () wypuszcza jeden wątek i wraca do zamknięte albo zostawia w otwarte ManualResetEvent wywołanie Set () wypuszcza wszystkie wątki i zostawia otwarte aż do Reset () WaitHandle.WaitAll (WaitHandle []) WaitHandle.WaitAny (WaitHandle []) 42

ThreadPool przykład public void CallbackFunc (object o){ StateInfo si = (StateInfo) o; Do Work (); public class StateInfo {... public void MainMethod () { ManualResetEvent evnt = new ManualResetEvent (false); WaitOrTimerCallback wotc = new WaitOrTimerCallback (CallbackFunc); StateInfo si = new StateInfo (...); int timeout = 100; // milliseconds bool onetime_exec = true; ThreadPool. RegisterWaitForSingleObject (evnt, wotc, si, timeout, onetime_exec);... evnt.set(); 43

Mutex standardowy mechanizm zamka WaitOne (), ReleaseMutex() sprawdza tożsamość wątków AbandonedMutexException ApplicationException, jeśli obiekt nie był właścicielem wątku Mutex m = new Mutex (true, nukem ); m.waitone (); LaunchNukes (); m.releasemutex (); 44

Monitor statyczna klasa wykonywany na typie referencyjnym Enter, TryEnter, Exit wejście/wyjście z monitora Wait opuszczenie sekcji krytycznej i zaśnięcie na monitorze Pulse, PulseAll sygnały private Object x; Monitor.Enter(x); try { finally { Monitor.Exit(x); 45

ReaderWriterLock(Slim) Implementacja blokady dla problemu czytelników i pisarzy Acquire/ReleaseReaderLock Acquire/ReleaseWriterLock LockCookie lc = UpgradeToWriterLock DowngradeFromWriterLock (ref LockCookie) Wszystkie metody z jawnym timeout'em Szybsza wersja Slim m.in. uproszczenie rekursji zamków 46

BackgroundWorker brak marshallingu do wątka GUI (Form.Invoke) wsparcie w VS Designer uruchomienie zadania DoWork += bw_dowork; bw.runworkerasync ("Message to worker"); raportowanie postępu zdarzenia RunWorkerCompleted i ProgressChanged właściwość WorkerReportsProgress = true wołanie ReportProgress z metody w DoWork anulowanie właściwość WorkerSupportsCancelation = true właściwość CancellationPending sprawdzana w metodzie z DoWork ustawienie w zdarzeniu właściwości Cancel = true i return wołanie CancelAsync żądaniem anulowania 47

Inne podejścia Interlocked Add (int, int), Increment (), Exchange () sekcje lock (Object) {... nie na this, typeof (this), ''string'' metody synchronizowane using System.Runtime.CompilerServices; [MethodImplAttribute(MethodImplOptions.Synchronized)] public void AsynchroMetod () operacje na GUI Form.Invoke (Delegate method, pars Object[] args) 48

Wątki i synchronizacja Tasks przestrzeń nazw System.Threading.Tasks Parallel.For i Parallel.ForEach Task i Task<T> TaskFactory Barrier SpinLock przestrzeń nazw System.Collections.Concurrent ConcurrentBag<T> ConcurrentDictionary<TKey, Tvalue> ConcurrentQueue<T> ConcurrentStack<T> 49

Task i Task<T> lekki wątek, wiele zadań może być uruchomionych w ramach 1 wątku (podobnie do ThreadPool) zarządzaniem zadaniami zajmuje się implementacja TaskScheduler opcje PreferFairness, LongRunning i AttachedToParent możliwość tworzenia zadań zagnieżdżonych i kontynuacji var taska = new Task(() => Console.WriteLine("Hello from taska.")); taska.start(); var taskb = Task.Factory.StartNew(() => Console.WriteLine("Hello from taskb.")); Task<double> taskretval = Task<double>.Factory.StartNew(() => DoComputation1()); Console.WriteLine (taskretval.result); 50

Task i Task<T> (2) continuations Task<string> reportdata2 = Task.Factory.StartNew(() => GetFileData()).ContinueWith((x) => Analyze(x.Result)).ContinueWith((y) => Summarize(y.Result)); zadania potomne var parent = Task.Factory.StartNew(() => { Console.WriteLine("Parent task beginning."); var child = Task.Factory.StartNew(() => { Thread.SpinWait(5000000); Console.WriteLine("Child completed.");, TaskCreationOptions.AttachedToParent); ); parent.wait(); Console.WriteLine("Parent task completed."); 51

Task i Task<T> (3) obsługa zadań void Wait () rzuca wyjątki: ObjectDisposedException po Dispose () AggregateException anulowanie lub wew. wyjątek static void WaitAll (params Task[] tasks) static void WaitAny (params Task[] tasks) static Task<Task> WhenAny(IEnumerable<Task> tasks) static Task<Task> WhenAll(IEnumerable<Task> tasks) pozwala czekać na Task: await Task.WhenAll(tasks); 52

Task i Task<T> (4) wyjątki var task1 = Task.Factory.StartNew(() => { throw new MyCustomException("I'm bad, but not too bad!"); ); Try { task1.wait(); catch (AggregateException ae) { foreach (var e in ae.innerexceptions) { if (e is MyCustomException) 53

Task i Task<T> (5) anulowanie i wyjątki private static Int32 Sum(CancellationToken ct, Int32 n) { for (;;) { ct.throwifcancellationrequested(); return sum; public static void Main() { CancellationTokenSource cts = new CancellationTokenSource(); Task<int32> t = new Task<int32>(() => Sum(cts.Token, 1000), cts.token); t.start(); cts.cancel(); try { // po anulowaniu Result rzuci AggregateException Console.WriteLine("The sum is: " + t.result); catch (AggregateException ae) { ae.handle(e => e is OperationCanceledException); Console.WriteLine("Sum was canceled"); Łukasz Piątkowski PiKSR, 2014/2015 54

async i Task/Task<T> przykłady async public async Task<string> GetStringAsync(string a){ await Task.Delay (3000); return "async: " + a; public async Task<string> GetStringNotAsync(string a){ Thread.Sleep (3000); return "notasync: " + a; Console.WriteLine("Starting async"); Task<string> at = GetStringAsync("aaa"); Console.WriteLine("Called async, it is working!"); string s = await at; Console.WriteLine(s); // czekamy Console.WriteLine("Starting notasync"); Task<string> nat = GetStringNotAsync("nnn"); // czekamy Console.WriteLine("Called notasync, working? not..."); string ns = await nat; Console.WriteLine(ns); Console.WriteLine(await GetStringAsync("ccc")); // czekamy 55

async i Task/Task<T> (2) porównanie Task<int> TaskDivideAsync(int nominator, int denominator) { Task<int> task = new Task<int>(() => { Thread.Sleep(10000); return (nominator / denominator); ); task.start(); return (task); async static Task<int> TaskDivideAsync(int nominator, int denominator) { await TaskEx.Run(() => Thread.Sleep(10000)); return (nominator / denominator); 56