SlideShare una empresa de Scribd logo
1 de 46
Παράλληλος και Ασύγχρονος Προγραμματισμός 
The server-side story 
Παναγιώτης Καναβός
Parallel Extensions 
• Best kept .NET secret known by all 
• Από το 2010 και το .NET 4.0 
• Καλύπτει τα Task, Data based μοντέλα 
επεξεργασίας 
• Ξαδερφάκια 
• TPL Dataflow 
• System.Reactive 
• Διαθέσιμα από NuGet 
• SIMD με το RyuJIT
Χρήση σε desktop 
• async/await για ασύγχρονα events 
• Task.Run για background Processing 
• Παράλληλη επεξεργασία 
• Προτεραιότητες 
• Αποφυγή μπλοκαρίσματος UI 
• Μείωση χρόνου εκτέλεσης 
• Χρήση όλων των cores
Τι διαφέρει ο Server 
• Δεν υπάρχει UI thread 
• Πολλοί ταυτόχρονοι χρήστες/requests 
• Throughput/Scalability πιο σημαντικά από 
διάρκεια request 
• Αλλά έχουμε timeouts 
• Πολλά services, πολλά συνδυασμένα timeouts 
• Και …
Server Meltdown
Server Meltdown 
• Load Balanced φάρμα 
• Μεγάλος φόρτος 
• Πρώτος server κολλάει στα 100% CPU 
• Timeouts, App pool Recycle 
• Περισσότερα requests στους υπόλοιπους server 
• Ο δεύτερος server φτάνει 100% 
• Κάτσε κάτω από τη μπάρα! 
• …
Request Queuing στο ASP.NET 
IIS Queue 
• Req 1 
• Req 2 
• Req 3 
ASP.NET Worker 
Threads 
• Thread 1 
• Thread 3 
App Domain 
• Thread 2
Γιατί … 
• Πολλά threads  Χειρότερο Scalability 
• Τόσα core έχεις, τόσα thread θα τρέξουν 
• Thrashing 
• Αν όλοι περιμένουν όλους, κανείς δεν τελειώνει 
• Μισεί τα blocking calls! 
• Εξάντληση Thread Pool  Δεν σερβίρουμε 
• 500 Too Busy 
• Άμεση Ενέργεια 
• App Pool Recycle 
• Όχι ότι μπορεί να γίνει και τίποτε άλλο …
Ασύγχρονη εκτέλεση 
• Σημαντικότερη για server από ταχύτητα 
• Stackless Python  Δεν υπάρχουν blocking calls 
• Η όψη της πραγματικότητας 
• Δεν υπάρχει blocking I/O σε επίπεδο λειτουργικού 
• I/O = File, Database, WS/REST calls 
• Στον IIS – IO Threads 
• Αφού το IO Thread κάνει τη δουλειά, εγώ τι το 
περιμένω?
Async σε WebForms 
• Βασική υποστήριξη async event handlers 
• async void Button_Click μπρρρ… 
• <%@ Page Async=“true” %> 
• Χρήση Page.RegisterAsyncTask για διαδικασίες που 
κρατάνε περισσότερο από το request 
• Χύμα Background threads μπορεί να σκοτωθούν 
οποιαδήποτε στιγμή
Async σε MVC/Web API 
• Async actions! 
• Παίζει ωραία με EF async 
• HostingEnvironment.QueueBackgroundWorkItem 
• Ενημερώνει τον IIS 
• Δίνει 90 sec στο task να τελειώσει σε περίπτωση 
shutdown/recycle 
• HangFire, Azure Web Jobs για επαναλαμβανόμενα 
tasks
Parallel.For και PLINQ 
• Data Parallelism 
• Κόβει τα δεδομένα σε κομμάτια 
• Task ανά κομμάτι 
• Γενικά 1 Task/Core 
• Χρησιμοποιεί και το calling thread 
• Φαίνεται να μπλοκάρει 
• Δεν μας νοιάζει στο server
Dataflow 
Κλήση στη βάση 
• I:Date 
• O:Sales 
Web call 
• I:Sale 
• O:Details 
• X3 
• Bounded 
Ανάλυση Αποθήκευση 
• Bulk Insert 
στη βάση
Dataflow – Παλιός Γνωστός
Τα βασικά 
• Μοντέλα επεξεργασίας 
• Agent και Pipeline 
• και MapReduce data processing 
• Ένα task ανά block (ρυθμίζεται) 
• Buffer εισερχομένων/εξερχομένων 
• Είδη Blocks 
• Buffering 
• Execution 
• Grouping 
• Συνδέσεις μεταξύ των block
Execution Blocks 
• Action Block 
• Κλασσικό Job Queue 
• Βασική υλοποίηση Agent 
• Transform Block 
• Μετατροπή ενός Input σε ένα Output 
• Για μία μετοχή καλώ ένα web service για να πάρω το 
ιστορικό ως ένα πακέτο 
• TransformMany Block 
• Για ένα input πολλά outputs 
• Παράλληλη εκτέλεση
Throttling 
• BoundedCapacity 
• Μέγιστος αριθμός εισερχόμενων 
• Μπλοκάρει τις πηγές 
• MaxMessagesPerTask 
• Recycle ενός Task μετά από X μηνύματα 
• CPU Throttling
Execution Block Demos
Buffering Blocks 
• Buffer Block 
• Εύκολη υλοποίηση Publisher/Subscriber 
• Broadcast Block 
• Το τελευταίο event σε πολλούς 
• WriteOnce block
Batch Block Demo
Grouping Blocks 
• Batching Block 
• Join Block 
• 2-3 Inputs, 1 Tuple<T1,T2,T3> output 
• BatchedJoin Block 
• Batch  Join 
• T1, T2  Tuple< IList<T1>, IList<T2>>
Grouping Block Demos
Συνδέσεις 
• LinkTo  IDisposable 
• Αποσύνδεση  Dispose 
• Ρυθμίσεις 
• Φίλτρα με Lambda 
• Propagate Completion
Συνδυασμός με Encapsulate 
• Νέο block 
• Ένα Input, ένα Output
Error Handling 
• Απόρριψη εισερχομένων 
• Άρνηση νέων εγγραφών 
• Προώθηση exception 
• Πιάνεται με await/.Wait()
Dataflow Demos
Reactive Extensions 
• Παρακολούθηση Γεγονότων 
• Control Events 
• Εγγραφές στο Event Log 
• Κλήσεις σε Web Service 
• Χρόνου 
• Διαχείριση ως stream 
• Δουλεύει με LINQ 
• Βάση για Event Processing
Πηγές 
• Οτιδήποτε υλοποιεί το IObservable<> 
• Χρόνος 
• Observable.Interval 
• Events 
• Observable.FromEventPattern 
• BeginXXX/EndXXX 
• Observable.FromAsyncPattern 
• State machines / “Loops” 
• Observable.Generate 
• Tasks 
• Οποιοδήποτε IEnumerable<T> 
• Subject<T>  mySubject.OnNext(data)
Reactive Demos
Χρήσιμα Functions 
• Interval 
• Buffer 
• Sample 
• Throttle 
• Window 
• Skip 
• Take 
• TakeUntil
Μετατροπές 
• Υποστηρίζονται όλα 
• task ... AsObservable() 
• block … AsObservable() 
• await Observable 
• ToTask<T>
SignalR 
• Real Time communication from Server to Client 
• Push Notifications 
• Long process progress 
• Eg. Search for tickets
Multiple Techniques 
• Web sockets, falling back to … 
• Server Sent Events 
• Forever Frame 
• Ajax Long Polling
Κλήση function στο Browser 
• Server-side: 
Clients.All.DoSomething(data) 
• Browser-side 
hub.client.updateProgress = function (data)
Connections and Hubs 
Browser 
Hub 
Browser 
Client 
application 
Browser 
Persistent 
Connection
Connections and Hubs
Scaleout μέσω Backplane
Υποστηριζόμενα backplanes 
• Windows Azure Bus 
• SQL Server 
• Redis 
• Το προτεινόμενο Distributed memory cache για νέα 
Azure projects 
• Open Source Rulez!
SignalR Demos
Χρήσιμες Πηγές - Courses 
MVA Course 
• Lighting up Real-Time Web Communications with SignalR 
Pluralshight Course 
• Async and Parallel Programming: Application Design 
Βιβλία 
• The C# Concurrency Cookbook, Stephen Cleary, O’Reilly
Χρήσιμες Πηγές - Sites 
Sites 
• Signal R 
• TPL Dataflow 
• Reactive Extensions 
• Using Asynchronous Methods in ASP.NET 
• 101 Rx Samples 
Blogs 
• Stephen Cleary 
• The Magic of using Acync in ASP.NET, Scott Hanselman 
• How to run background tasks in ASP.NET, Scott Hanselman
Session Evaluation 
Your feedback is 
important and valuable 
Submit before the event’s 
close session to WIN 
prizes 
2ways 
to access 
Go to 
m.itprodevconnections.gr 
Ask for an Evaluation Sheet from 
the registration desk
MVA 
Microsoft Virtual Academy for IT Pros 
/licensing/ 
/virtualization/ 
/server-infrastructure/ 
/hybrid-cloud/ 
/private-cloud/ 
/desktop-devices-management/ 
/και πολλά άλλα… 
www.microsoftvirtualacademy.com 
Όλα τα trainings που χρειάζεσαι δωρεάν σε ένα site!
MVA 
Microsoft Virtual Academy LIVE 
1 ως 4 Δεκεμβρίου 
4 ΜΕΡΕΣ Εκπαίδευση με το Mark Russinovich 
ΔΩΡΕΑΝ ΠΡΟΕΤΟΙΜΑΣΙΑ για την Εξέταση 70-533: Implementing Azure Infrastructure Solutions 
Και 50% ΕΚΠΤΩΤΙΚΟ VOUCHER ΣΤΟ ΚΟΣΤΟΣ ΤΗΣ ΕΞΕΤΑΣΗΣ 
www.microsoftvirtualacademy.com 
Όλα τα trainings που χρειάζεσαι δωρεάν σε ένα site!
MVA 
Microsoft Virtual Academy for Devs 
/app development/ 
/game development / 
/web development / 
/mobile development / 
/cloud development / 
/C#-XAML-HTML/ 
/visual studio και πολλά άλλα… 
www.microsoftvirtualacademy.com 
Όλα τα trainings που χρειάζεσαι δωρεάν σε ένα site!
The Server-SIde Story: Παράλληλος και ασύγχρονος προγραμματισμός στο .NET - ITProDevConnections 2014

Más contenido relacionado

Similar a The Server-SIde Story: Παράλληλος και ασύγχρονος προγραμματισμός στο .NET - ITProDevConnections 2014

Pantelidou Eirini: Design and development of a system for incremental static ...
Pantelidou Eirini: Design and development of a system for incremental static ...Pantelidou Eirini: Design and development of a system for incremental static ...
Pantelidou Eirini: Design and development of a system for incremental static ...
Manos Tsardoulias
 
1η διάλεξη Τεχνολογίες Παγκόσμιου Ιστού
1η διάλεξη Τεχνολογίες Παγκόσμιου Ιστού1η διάλεξη Τεχνολογίες Παγκόσμιου Ιστού
1η διάλεξη Τεχνολογίες Παγκόσμιου Ιστού
Manolis Vavalis
 
Real Life Task Parallel Library, ITProDevConnections 2011 (Greek)
Real Life Task Parallel Library, ITProDevConnections 2011 (Greek)Real Life Task Parallel Library, ITProDevConnections 2011 (Greek)
Real Life Task Parallel Library, ITProDevConnections 2011 (Greek)
Panagiotis Kanavos
 
Παρουσίαση Office365_C2
Παρουσίαση Office365_C2Παρουσίαση Office365_C2
Παρουσίαση Office365_C2
Aris Kolleris
 

Similar a The Server-SIde Story: Παράλληλος και ασύγχρονος προγραμματισμός στο .NET - ITProDevConnections 2014 (20)

Ch6 conversational state
Ch6   conversational stateCh6   conversational state
Ch6 conversational state
 
Christainas grigorios
Christainas grigoriosChristainas grigorios
Christainas grigorios
 
Panagiotis Doxopoulos
Panagiotis DoxopoulosPanagiotis Doxopoulos
Panagiotis Doxopoulos
 
Pantelidou Eirini: Design and development of a system for incremental static ...
Pantelidou Eirini: Design and development of a system for incremental static ...Pantelidou Eirini: Design and development of a system for incremental static ...
Pantelidou Eirini: Design and development of a system for incremental static ...
 
1η διάλεξη Τεχνολογίες Παγκόσμιου Ιστού
1η διάλεξη Τεχνολογίες Παγκόσμιου Ιστού1η διάλεξη Τεχνολογίες Παγκόσμιου Ιστού
1η διάλεξη Τεχνολογίες Παγκόσμιου Ιστού
 
Real Life Task Parallel Library, ITProDevConnections 2011 (Greek)
Real Life Task Parallel Library, ITProDevConnections 2011 (Greek)Real Life Task Parallel Library, ITProDevConnections 2011 (Greek)
Real Life Task Parallel Library, ITProDevConnections 2011 (Greek)
 
Θεμιστοκλής Παπαβασιλείου
Θεμιστοκλής ΠαπαβασιλείουΘεμιστοκλής Παπαβασιλείου
Θεμιστοκλής Παπαβασιλείου
 
Omeka
OmekaOmeka
Omeka
 
Andreas Hadjithomas
Andreas HadjithomasAndreas Hadjithomas
Andreas Hadjithomas
 
Silverlight Presentation @ University of Piraeus - 3-15-2010
Silverlight Presentation @ University of Piraeus - 3-15-2010Silverlight Presentation @ University of Piraeus - 3-15-2010
Silverlight Presentation @ University of Piraeus - 3-15-2010
 
Ι. Χρυσάφης OTS
Ι. Χρυσάφης OTSΙ. Χρυσάφης OTS
Ι. Χρυσάφης OTS
 
Γνωριμία με την ASP.NET 2.0
Γνωριμία με την ASP.NET 2.0Γνωριμία με την ASP.NET 2.0
Γνωριμία με την ASP.NET 2.0
 
Ναταλία Μιχαηλίδου
Ναταλία ΜιχαηλίδουΝαταλία Μιχαηλίδου
Ναταλία Μιχαηλίδου
 
Καρβούνης Ευάγγελος
Καρβούνης Ευάγγελος Καρβούνης Ευάγγελος
Καρβούνης Ευάγγελος
 
EPLAN Version 2.8
EPLAN Version 2.8EPLAN Version 2.8
EPLAN Version 2.8
 
SingularLogic Galaxy
SingularLogic GalaxySingularLogic Galaxy
SingularLogic Galaxy
 
77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...
77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...
77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...
 
e-ΕΠΑΛ: Το έργο, η ομάδα, οι τεχνολογικές προκλήσεις - FOSSCOMM 2017
e-ΕΠΑΛ: Το έργο, η ομάδα, οι τεχνολογικές προκλήσεις - FOSSCOMM 2017e-ΕΠΑΛ: Το έργο, η ομάδα, οι τεχνολογικές προκλήσεις - FOSSCOMM 2017
e-ΕΠΑΛ: Το έργο, η ομάδα, οι τεχνολογικές προκλήσεις - FOSSCOMM 2017
 
Παρουσίαση Office365_C2
Παρουσίαση Office365_C2Παρουσίαση Office365_C2
Παρουσίαση Office365_C2
 
Εισαγωγή σε C# και .ΝΕΤ
Εισαγωγή σε C# και .ΝΕΤΕισαγωγή σε C# και .ΝΕΤ
Εισαγωγή σε C# και .ΝΕΤ
 

The Server-SIde Story: Παράλληλος και ασύγχρονος προγραμματισμός στο .NET - ITProDevConnections 2014

  • 1. Παράλληλος και Ασύγχρονος Προγραμματισμός The server-side story Παναγιώτης Καναβός
  • 2. Parallel Extensions • Best kept .NET secret known by all • Από το 2010 και το .NET 4.0 • Καλύπτει τα Task, Data based μοντέλα επεξεργασίας • Ξαδερφάκια • TPL Dataflow • System.Reactive • Διαθέσιμα από NuGet • SIMD με το RyuJIT
  • 3. Χρήση σε desktop • async/await για ασύγχρονα events • Task.Run για background Processing • Παράλληλη επεξεργασία • Προτεραιότητες • Αποφυγή μπλοκαρίσματος UI • Μείωση χρόνου εκτέλεσης • Χρήση όλων των cores
  • 4. Τι διαφέρει ο Server • Δεν υπάρχει UI thread • Πολλοί ταυτόχρονοι χρήστες/requests • Throughput/Scalability πιο σημαντικά από διάρκεια request • Αλλά έχουμε timeouts • Πολλά services, πολλά συνδυασμένα timeouts • Και …
  • 6. Server Meltdown • Load Balanced φάρμα • Μεγάλος φόρτος • Πρώτος server κολλάει στα 100% CPU • Timeouts, App pool Recycle • Περισσότερα requests στους υπόλοιπους server • Ο δεύτερος server φτάνει 100% • Κάτσε κάτω από τη μπάρα! • …
  • 7. Request Queuing στο ASP.NET IIS Queue • Req 1 • Req 2 • Req 3 ASP.NET Worker Threads • Thread 1 • Thread 3 App Domain • Thread 2
  • 8. Γιατί … • Πολλά threads  Χειρότερο Scalability • Τόσα core έχεις, τόσα thread θα τρέξουν • Thrashing • Αν όλοι περιμένουν όλους, κανείς δεν τελειώνει • Μισεί τα blocking calls! • Εξάντληση Thread Pool  Δεν σερβίρουμε • 500 Too Busy • Άμεση Ενέργεια • App Pool Recycle • Όχι ότι μπορεί να γίνει και τίποτε άλλο …
  • 9. Ασύγχρονη εκτέλεση • Σημαντικότερη για server από ταχύτητα • Stackless Python  Δεν υπάρχουν blocking calls • Η όψη της πραγματικότητας • Δεν υπάρχει blocking I/O σε επίπεδο λειτουργικού • I/O = File, Database, WS/REST calls • Στον IIS – IO Threads • Αφού το IO Thread κάνει τη δουλειά, εγώ τι το περιμένω?
  • 10. Async σε WebForms • Βασική υποστήριξη async event handlers • async void Button_Click μπρρρ… • <%@ Page Async=“true” %> • Χρήση Page.RegisterAsyncTask για διαδικασίες που κρατάνε περισσότερο από το request • Χύμα Background threads μπορεί να σκοτωθούν οποιαδήποτε στιγμή
  • 11. Async σε MVC/Web API • Async actions! • Παίζει ωραία με EF async • HostingEnvironment.QueueBackgroundWorkItem • Ενημερώνει τον IIS • Δίνει 90 sec στο task να τελειώσει σε περίπτωση shutdown/recycle • HangFire, Azure Web Jobs για επαναλαμβανόμενα tasks
  • 12. Parallel.For και PLINQ • Data Parallelism • Κόβει τα δεδομένα σε κομμάτια • Task ανά κομμάτι • Γενικά 1 Task/Core • Χρησιμοποιεί και το calling thread • Φαίνεται να μπλοκάρει • Δεν μας νοιάζει στο server
  • 13. Dataflow Κλήση στη βάση • I:Date • O:Sales Web call • I:Sale • O:Details • X3 • Bounded Ανάλυση Αποθήκευση • Bulk Insert στη βάση
  • 14. Dataflow – Παλιός Γνωστός
  • 15. Τα βασικά • Μοντέλα επεξεργασίας • Agent και Pipeline • και MapReduce data processing • Ένα task ανά block (ρυθμίζεται) • Buffer εισερχομένων/εξερχομένων • Είδη Blocks • Buffering • Execution • Grouping • Συνδέσεις μεταξύ των block
  • 16. Execution Blocks • Action Block • Κλασσικό Job Queue • Βασική υλοποίηση Agent • Transform Block • Μετατροπή ενός Input σε ένα Output • Για μία μετοχή καλώ ένα web service για να πάρω το ιστορικό ως ένα πακέτο • TransformMany Block • Για ένα input πολλά outputs • Παράλληλη εκτέλεση
  • 17. Throttling • BoundedCapacity • Μέγιστος αριθμός εισερχόμενων • Μπλοκάρει τις πηγές • MaxMessagesPerTask • Recycle ενός Task μετά από X μηνύματα • CPU Throttling
  • 19. Buffering Blocks • Buffer Block • Εύκολη υλοποίηση Publisher/Subscriber • Broadcast Block • Το τελευταίο event σε πολλούς • WriteOnce block
  • 21. Grouping Blocks • Batching Block • Join Block • 2-3 Inputs, 1 Tuple<T1,T2,T3> output • BatchedJoin Block • Batch  Join • T1, T2  Tuple< IList<T1>, IList<T2>>
  • 23. Συνδέσεις • LinkTo  IDisposable • Αποσύνδεση  Dispose • Ρυθμίσεις • Φίλτρα με Lambda • Propagate Completion
  • 24. Συνδυασμός με Encapsulate • Νέο block • Ένα Input, ένα Output
  • 25. Error Handling • Απόρριψη εισερχομένων • Άρνηση νέων εγγραφών • Προώθηση exception • Πιάνεται με await/.Wait()
  • 27. Reactive Extensions • Παρακολούθηση Γεγονότων • Control Events • Εγγραφές στο Event Log • Κλήσεις σε Web Service • Χρόνου • Διαχείριση ως stream • Δουλεύει με LINQ • Βάση για Event Processing
  • 28. Πηγές • Οτιδήποτε υλοποιεί το IObservable<> • Χρόνος • Observable.Interval • Events • Observable.FromEventPattern • BeginXXX/EndXXX • Observable.FromAsyncPattern • State machines / “Loops” • Observable.Generate • Tasks • Οποιοδήποτε IEnumerable<T> • Subject<T>  mySubject.OnNext(data)
  • 30. Χρήσιμα Functions • Interval • Buffer • Sample • Throttle • Window • Skip • Take • TakeUntil
  • 31. Μετατροπές • Υποστηρίζονται όλα • task ... AsObservable() • block … AsObservable() • await Observable • ToTask<T>
  • 32. SignalR • Real Time communication from Server to Client • Push Notifications • Long process progress • Eg. Search for tickets
  • 33. Multiple Techniques • Web sockets, falling back to … • Server Sent Events • Forever Frame • Ajax Long Polling
  • 34. Κλήση function στο Browser • Server-side: Clients.All.DoSomething(data) • Browser-side hub.client.updateProgress = function (data)
  • 35. Connections and Hubs Browser Hub Browser Client application Browser Persistent Connection
  • 38. Υποστηριζόμενα backplanes • Windows Azure Bus • SQL Server • Redis • Το προτεινόμενο Distributed memory cache για νέα Azure projects • Open Source Rulez!
  • 40. Χρήσιμες Πηγές - Courses MVA Course • Lighting up Real-Time Web Communications with SignalR Pluralshight Course • Async and Parallel Programming: Application Design Βιβλία • The C# Concurrency Cookbook, Stephen Cleary, O’Reilly
  • 41. Χρήσιμες Πηγές - Sites Sites • Signal R • TPL Dataflow • Reactive Extensions • Using Asynchronous Methods in ASP.NET • 101 Rx Samples Blogs • Stephen Cleary • The Magic of using Acync in ASP.NET, Scott Hanselman • How to run background tasks in ASP.NET, Scott Hanselman
  • 42. Session Evaluation Your feedback is important and valuable Submit before the event’s close session to WIN prizes 2ways to access Go to m.itprodevconnections.gr Ask for an Evaluation Sheet from the registration desk
  • 43. MVA Microsoft Virtual Academy for IT Pros /licensing/ /virtualization/ /server-infrastructure/ /hybrid-cloud/ /private-cloud/ /desktop-devices-management/ /και πολλά άλλα… www.microsoftvirtualacademy.com Όλα τα trainings που χρειάζεσαι δωρεάν σε ένα site!
  • 44. MVA Microsoft Virtual Academy LIVE 1 ως 4 Δεκεμβρίου 4 ΜΕΡΕΣ Εκπαίδευση με το Mark Russinovich ΔΩΡΕΑΝ ΠΡΟΕΤΟΙΜΑΣΙΑ για την Εξέταση 70-533: Implementing Azure Infrastructure Solutions Και 50% ΕΚΠΤΩΤΙΚΟ VOUCHER ΣΤΟ ΚΟΣΤΟΣ ΤΗΣ ΕΞΕΤΑΣΗΣ www.microsoftvirtualacademy.com Όλα τα trainings που χρειάζεσαι δωρεάν σε ένα site!
  • 45. MVA Microsoft Virtual Academy for Devs /app development/ /game development / /web development / /mobile development / /cloud development / /C#-XAML-HTML/ /visual studio και πολλά άλλα… www.microsoftvirtualacademy.com Όλα τα trainings που χρειάζεσαι δωρεάν σε ένα site!