Quem sou eu? Rodrigo   Vidal   Twitter: @rodrigovidal   www.rodrigovidal.net Foco em Arquitetura de Software Evangeli...
Evolução do C# e VB             C# 4.0 + VB 10.0                                      Dinamismo + paridade nas            ...
Tendências                   Declarativo             Dinâmico
Tendências   Aplicações cada vez mais conectadas       Mais latência       Mais problemas de responsividade da interfac...
Evolução do C# e VB                  C# 5.0 + VB 11.0                                          Programação assíncrona     ...
O que há de novo?       Programação assíncrona          Programação assíncrona       Atributos de informação de      A...
Assincronia em poucas palavras   Síncrono  Espero o resultado antes de retonar       string DownloadString(...);   Ass...
Síncrono versus Assíncronovar data = DownloadData(...);ProcessData(data);DownloadDataAsync(... , data => {    ProcessData(...
Síncrono versus Assíncronovar data = DownloadData(...);ProcessData(data);DownloadDataAsync(... , data => {    ProcessData(...
Fluxo de controle assíncronoasync void DoWorkAsync() {    var t1 = ProcessFeedAsync("www.acme.com/rss");    var t2 = Proce...
Fluxo de controle assíncronoasync void DoWorkAsync() {    var t1 = ProcessFeedAsync("www.acme.com/rss");    var t2 = Proce...
Fluxo de controle assíncronoasync void DoWorkAsync() {    var t1 = ProcessFeedAsync("www.acme.com/rss");    var t2 = Proce...
Fluxo de controle assíncronoasync void DoWorkAsync() {    var t1 = ProcessFeedAsync("www.acme.com/rss");    var t2 = Proce...
Fluxo de controle assíncronoasync void DoWorkAsync() {    var t1 = ProcessFeedAsync("www.acme.com/rss");    var t2 = Proce...
Fluxo de controle assíncronoasync void DoWorkAsync() {    var t1 = ProcessFeedAsync("www.acme.com/rss");    var t2 = Proce...
Fluxo de controle assíncronoasync void DoWorkAsync() {    var t1 = ProcessFeedAsync("www.acme.com/rss");    var t2 = Proce...
Fluxo de controle assíncronoasync void DoWorkAsync() {    var t1 = ProcessFeedAsync("www.acme.com/rss");    var t2 = Proce...
Fluxo de controle assíncronoasync void DoWorkAsync() {    var t1 = ProcessFeedAsync("www.acme.com/rss");    var t2 = Proce...
Fluxo de controle assíncronoasync void DoWorkAsync() {    var t1 = ProcessFeedAsync("www.acme.com/rss");    var t2 = Proce...
Fluxo de controle assíncronoasync void DoWorkAsync() {    var t1 = ProcessFeedAsync("www.acme.com/rss");    var t2 = Proce...
Fluxo de controle assíncronoasync void DoWorkAsync() {    var t1 = ProcessFeedAsync("www.acme.com/rss");    var t2 = Proce...
Fluxo de controle assíncronoasync void DoWorkAsync() {    var t1 = ProcessFeedAsync("www.acme.com/rss");    var t2 = Proce...
Fluxo de controle assíncronoasync void DoWorkAsync() {    var t1 = ProcessFeedAsync("www.acme.com/rss");    var t2 = Proce...
Fluxo de controle assíncronoasync void DoWorkAsync() {    var t1 = ProcessFeedAsync("www.acme.com/rss");    var t2 = Proce...
Fluxo de controle assíncronoasync void DoWorkAsync() {    var t1 = ProcessFeedAsync("www.acme.com/rss");    var t2 = Proce...
Fluxo de controle assíncronoasync void DoWorkAsync() {    var t1 = ProcessFeedAsync("www.acme.com/rss");    var t2 = Proce...
Como funciona?async Task<XElement> GetRssAsync(string url) {    var client = new WebClient();    var task = client.Downloa...
Como funciona?async Task<XElement> GetRssAsync(string url) {    var client = new WebClient();    var task = client.Downloa...
Como funciona?              Task<XElement> GetRssAsync(string url) {                  var $builder = AsyncTaskMethodBuilde...
Como funciona?              Task<XElement> GetRssAsync(string url) {                  var $builder = AsyncTaskMethodBuilde...
Como funciona?              Task<XElement> GetRssAsync(string url) {                  var $builder = AsyncTaskMethodBuilde...
Como funciona?              Task<XElement> GetRssAsync(string url) {                  var $builder = AsyncTaskMethodBuilde...
Suporte no .NET Framework
Evolução do C# e VB                  C# 5.0 + VB 11.0                                          Programação assíncrona     ...
Compiler as a Service                                Clas  Meta-programação               s                               ...
Roslyn APIs    Language      Service    Compiler       APIs    Compiler     Pipeline   Metadata                 Import
Conteúdo Relacionado http://msdn.com/vstudio/async
C5, vb11, f3
C5, vb11, f3
C5, vb11, f3
C5, vb11, f3
C5, vb11, f3
C5, vb11, f3
Upcoming SlideShare
Loading in …5
×

C5, vb11, f3

1,700 views

Published on

Presentation about C# 5, F# 3 and VB11

Published in: Technology
  • Be the first to comment

  • Be the first to like this

C5, vb11, f3

  1. 1. Quem sou eu? Rodrigo Vidal  Twitter: @rodrigovidal  www.rodrigovidal.net Foco em Arquitetura de Software Evangelista da Linguagem F# Professional Scrum Developer Microsoft Student Partner
  2. 2. Evolução do C# e VB C# 4.0 + VB 10.0 Dinamismo + paridade nas linguagens C# 3.0 + VB 9.0 Language Integrated Query C# 2.0 + VB 8.0 GenericsC# 1.0 + VB 7.0 Código gerenciado
  3. 3. Tendências Declarativo Dinâmico
  4. 4. Tendências Aplicações cada vez mais conectadas  Mais latência  Mais problemas de responsividade da interface gráfica (IG)  Mais problemas de escalabilidade Programação assíncrona  Está se tornando a norma em aplicações escaladas e responsivas  APIs que são somente assíncronas, como JavaScript e Silverlight
  5. 5. Evolução do C# e VB C# 5.0 + VB 11.0 Programação assíncrona C# 4.0 + VB 10.0 Dinamismo + paridade nas linguagens C# 3.0 + VB 9.0 Language Integrated Query C# 2.0 + VB 8.0 GenericsC# 1.0 + VB 7.0 Código gerenciado
  6. 6. O que há de novo? Programação assíncrona  Programação assíncrona Atributos de informação de  Atributos de informação de chamada chamada  Iterators  Type Providers  Query Expressions
  7. 7. Assincronia em poucas palavras Síncrono  Espero o resultado antes de retonar  string DownloadString(...); Assíncrono  Retorne agora, chame de volta com o resultado  void DownloadStringAsync(..., Action<string> callback); Benefícios da assincronia  Responsividade da interface gráfica: libera as threads de IG para interação com o usuário  Escalabilidade do servidor: A thread pode ser reutilizada para outras requisições
  8. 8. Síncrono versus Assíncronovar data = DownloadData(...);ProcessData(data);DownloadDataAsync(... , data => { ProcessData(data);});
  9. 9. Síncrono versus Assíncronovar data = DownloadData(...);ProcessData(data);DownloadDataAsync(... , data => { ProcessData(data);});
  10. 10. Fluxo de controle assíncronoasync void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done");} async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); }
  11. 11. Fluxo de controle assíncronoasync void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done");} async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); }
  12. 12. Fluxo de controle assíncronoasync void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done");} async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); }
  13. 13. Fluxo de controle assíncronoasync void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done");} async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); }
  14. 14. Fluxo de controle assíncronoasync void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done");} async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); }
  15. 15. Fluxo de controle assíncronoasync void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done");} async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); }
  16. 16. Fluxo de controle assíncronoasync void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done");} async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); }
  17. 17. Fluxo de controle assíncronoasync void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done");} async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); } 
  18. 18. Fluxo de controle assíncronoasync void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done");} async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); } 
  19. 19. Fluxo de controle assíncronoasync void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done");} async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); }  
  20. 20. Fluxo de controle assíncronoasync void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done");} async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); }  
  21. 21. Fluxo de controle assíncronoasync void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done");} async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); }   
  22. 22. Fluxo de controle assíncronoasync void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done");} async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); }    
  23. 23. Fluxo de controle assíncronoasync void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done");} async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); }     
  24. 24. Fluxo de controle assíncronoasync void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done");} async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); }      
  25. 25. Fluxo de controle assíncronoasync void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done");} async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); }       
  26. 26. Fluxo de controle assíncronoasync void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done");} async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); }       
  27. 27. Como funciona?async Task<XElement> GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml;}
  28. 28. Como funciona?async Task<XElement> GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml;} Task<XElement> GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); return task.ContinueWith(delegate { var text = task.Result; var xml = XElement.Parse(text); return xml; }); }
  29. 29. Como funciona? Task<XElement> GetRssAsync(string url) { var $builder = AsyncTaskMethodBuilder<XElement>.Create();async Task<XElement> $state = 0; var TaskAwaiter<string> $a1;GetRssAsync(string url) { Action $resume = delegate { var client = new try { WebClient(); var task = if ($state == 1) goto L1;client.DownloadStringTaskAsync(url);new WebClient(); var client = var text = await task; task = client.DownloadStringTaskAsync(url); var $a1 = task.GetAwaiter(); var xml = XElement.Parse(text); return xml; if ($a1.IsCompleted) goto L1;} $state = 1; $a1.OnCompleted($resume); return; L1: var text = $a1.GetResult(); var xml = XElement.Parse(text); $builder.SetResult(xml); } catch (Exception $ex) { $builder.SetException($ex); } }; $resume(); return $builder.Task; }
  30. 30. Como funciona? Task<XElement> GetRssAsync(string url) { var $builder = AsyncTaskMethodBuilder<XElement>.Create();async Task<XElement> $state = 0; var TaskAwaiter<string> $a1;GetRssAsync(string url) { Action $resume = delegate { var client = new try { WebClient(); var task = if ($state == 1) goto L1;client.DownloadStringTaskAsync(url);new WebClient(); var client = var text = await task; task = client.DownloadStringTaskAsync(url); var $a1 = task.GetAwaiter(); var xml = XElement.Parse(text); return xml; if ($a1.IsCompleted) goto L1;} $state = 1; $a1.OnCompleted($resume); return; L1: var text = $a1.GetResult(); var xml = XElement.Parse(text); $builder.SetResult(xml); } catch (Exception $ex) { $builder.SetException($ex); } }; $resume(); return $builder.Task; }
  31. 31. Como funciona? Task<XElement> GetRssAsync(string url) { var $builder = AsyncTaskMethodBuilder<XElement>.Create();async Task<XElement> $state = 0; var TaskAwaiter<string> $a1;GetRssAsync(string url) { Action $resume = delegate { var client = new try { WebClient(); var task = if ($state == 1) goto L1;client.DownloadStringTaskAsync(url);new WebClient(); var client = var text = await task; task = client.DownloadStringTaskAsync(url); var $a1 = task.GetAwaiter(); var xml = XElement.Parse(text); return xml; if ($a1.IsCompleted) goto L1;} $state = 1; $a1.OnCompleted($resume); return; L1: var text = $a1.GetResult(); var xml = XElement.Parse(text); $builder.SetResult(xml); } catch (Exception $ex) { $builder.SetException($ex); } }; $resume(); return $builder.Task; }
  32. 32. Como funciona? Task<XElement> GetRssAsync(string url) { var $builder = AsyncTaskMethodBuilder<XElement>.Create();async Task<XElement> $state = 0; var TaskAwaiter<string> $a1;GetRssAsync(string url) { Action $resume = delegate { var client = new try { WebClient(); var task = if ($state == 1) goto L1;client.DownloadStringTaskAsync(url);new WebClient(); var client = var text = await task; task = client.DownloadStringTaskAsync(url); var $a1 = task.GetAwaiter(); var xml = XElement.Parse(text); return xml; if ($a1.IsCompleted) goto L1;} $state = 1; $a1.OnCompleted($resume); return; L1: var text = $a1.GetResult(); var xml = XElement.Parse(text); $builder.SetResult(xml); } catch (Exception $ex) { $builder.SetException($ex); } }; $resume(); return $builder.Task; }
  33. 33. Suporte no .NET Framework
  34. 34. Evolução do C# e VB C# 5.0 + VB 11.0 Programação assíncrona C# 4.0 + VB 10.0 Dinamismo + paridade nas linguagens C# 3.0 + VB 9.0 Language Integrated Query C# 2.0 + VB 8.0 GenericsC# 1.0 + VB 7.0 Código gerenciado
  35. 35. Compiler as a Service Clas Meta-programação s Read-Eval-Print Loop (REPL) public Foo Fiel Modelo de objetos d Incorporação de DSLs da linguagem private X string Código Assembly Source Fonte Source .NET Source code Compilador Source code code code
  36. 36. Roslyn APIs Language Service Compiler APIs Compiler Pipeline Metadata Import
  37. 37. Conteúdo Relacionado http://msdn.com/vstudio/async

×