Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

rioinfo2012

1,145 views

Published on

PROGRAMAÇÃO ASSÍNCRONA EM .NET 4.5

Published in: Technology, News & Politics
  • Be the first to like this

rioinfo2012

  1. 1. PROGRAMAÇÃOCONCORRENTEEM .NET 4.5JUAN LOPEStwitter.com/juanplopesgithub.com/juanplopes
  2. 2. PROGRAMAÇÃOTALVEZ CONCORRENTEEM .NET 4.5JUAN LOPEStwitter.com/juanplopesgithub.com/juanplopes
  3. 3. PROGRAMAÇÃOASSÍNCRONAEM .NET 4.5JUAN LOPEStwitter.com/juanplopesgithub.com/juanplopes
  4. 4. EU PROGRAMO WEB
  5. 5. EU PROGRAMO WEBPOR QUE PROGRAMARASSINCRONAMENTE?
  6. 6. EU PROGRAMO WEBPOR QUE PROGRAMARASSINCRONAMENTE? MENOR LATÊNCIAMAIOR RESPONSIVIDADE
  7. 7. WINDOWS XPWINDOWS FORMSNÃO BLOQUEIE A THREAD DA UI
  8. 8. WINDOWS 8 WINRTNÃO BLOQUEIE A THREAD DA UI
  9. 9. I/O vs CPU
  10. 10. I/O vs CPUI/O É MAIS CARO
  11. 11. I/O vs CPUI/O É MAIS LENTO
  12. 12. I/O vs CPUI/O É MAIS LENTO DISCO REDE BANCO DE DADOS
  13. 13. PROGRAMAÇÃOCONCORRENTE
  14. 14. PROGRAMAÇÃOCONCORRENTE THREADS
  15. 15. PROGRAMAÇÃOCONCORRENTE É DIFÍCIL
  16. 16. PROGRAMAÇÃOCONCORRENTE É DIFÍCIL OU NÃO
  17. 17. COMO NÃO FAZER:new Thread(() =>{ //código lento}).Start();
  18. 18. TALVEZ NÃO PROGRAMAR CONCORRENTEMENTE?
  19. 19. TALVEZ NÃO PROGRAMAR CONCORRENTEMENTE? TALVEZ ASSINCRONAMENTE
  20. 20. MAS ANTES,O QUE TEMOS HOJE?
  21. 21. ATÉ .NET 3.5BeginInvoke EndInvoke
  22. 22. Func<string> ler = () => File.ReadAllText(@"C:test.txt");var handle = ler.BeginInvoke(null, null);//qualquer outro códigovar resultado = ler.EndInvoke(handle);
  23. 23. var req = WebRequest.Create("http://google.com");var handle = req.BeginGetRequestStream(null, null);//qualquer códigovar stream = req.EndGetRequestStream(handle);
  24. 24. ATÉ .NET 3.5Begin[QualquerCoisa] End[QualquerCoisa]
  25. 25. ATÉ .NET 3.5Begin[QualquerCoisa] End[QualquerCoisa] THREADS RACE CONDITIONS MAIS COMPLICADO
  26. 26. .NET 4.0PARALLEL EXTENSIONS PLINQ (Parallel LINQ) +TPL (Task Parallel Library)
  27. 27. .NET 4.0PLINQ (Parallel LINQ)
  28. 28. var files = new[] {"file1.txt", "file2.txt"};var contents = string.Join("", files .AsParallel() .Select(File.ReadAllText) .ToArray());
  29. 29. .NET 4.0TPL (Task Parallel Library)
  30. 30. .NET 4.0TPL (Task Parallel Library) Task<T>
  31. 31. var task = Task.Run(() => File.ReadAllText(@"C:test.txt"));//qualquer outro códigovar resultado = task.Result;
  32. 32. .NET 4.0TPL (Task Parallel Library) THREADS RACE CONDITIONS MENOS COMPLICADO
  33. 33. .NET 4.5 ASYNC AWAIT
  34. 34. fs.readFile(test.txt, function (err, data) { if (err) throw err; console.log(data);});
  35. 35. Task.Run(() => File.ReadAllText(@"test.txt")) .ContinueWith(x => Console.WriteLine(x.Result));
  36. 36. var task = Task.Run(() => File.ReadAllText(@"test.txt"));task.ContinueWith(x => Console.WriteLine(x.Result));
  37. 37. var task = Task.Run(() => File.ReadAllText(@"test.txt"));Console.WriteLine(await task);
  38. 38. static async Task<int> GoogleMaisYahoo(){ var http = new HttpClient(); var google = http.GetStringAsync("http://google.com"); var yahoo = http.GetStringAsync("http://yahoo.com"); return (await google).Length + (await yahoo).Length;}static void Main(string[] args){ var task = GooglePlusYahoo(); //qualquer código Console.WriteLine(task.Result); Console.ReadLine();}
  39. 39. static Task<int> GooglePlusYahoo(){ var http = new HttpClient(); var google = http.GetStringAsync("http://google.com"); var yahoo = http.GetStringAsync("http://yahoo.com"); return Task.WhenAll(google, yahoo) .ContinueWith(x => x.Result[0].Length + x.Result[1].Length);}static void Main(string[] args){ var task = GooglePlusYahoo(); //qualquer código Console.WriteLine(task.Result); Console.ReadLine();}
  40. 40. .NET 4.5 ASYNC AWAIT SEM THREADSSEM RACE CONDITIONSMUITO MENOS COMPLICADO
  41. 41. RESOLVE 92.4242% DOS PROBLEMAS QUE THREADS RESOLVEM, APROXIMADAMENTE
  42. 42. private async void button1_Click(object sender, EventArgs e){ var http = new HttpClient(); page.Text = "Loading..."; page.Text = await http.GetStringAsync("http://google.com");}
  43. 43. MESMA THREAD QUE CHAMOU O MÉTODO POTENCIALMENTE NOVA THREADprivate async void button1_Click(object sender, EventArgs e){ var http = new HttpClient(); page.Text = "Loading..."; page.Text = await http.GetStringAsync("http://google.com");}
  44. 44. ENTÃO CONTINUAMOS COM THREADSBLOQUEADAS EM I/O?
  45. 45. ENTÃO CONTINUAMOS COM THREADSBLOQUEADAS EM I/O? NÃO
  46. 46. IOCP
  47. 47. IOCPI/O COMPLETION PORTSFUNCIONALIDADE DO S.O.ASYNC "THREADLESS" I/O
  48. 48. NÃO HÁ THREADSBLOQUEADAS ESPERANDO CADA I/O TERMINAR
  49. 49. NÃO HÁ THREADSBLOQUEADAS ESPERANDO CADA I/O TERMINARHÁ UMA ÚNICA THREAD DE IO QUE LÊ UMA FILA
  50. 50. MÉTODOS DA BCL QUETERMINAM COM "ASYNC",GERALMENTE USAM IOCP
  51. 51. MÉTODOS DA BCL QUETERMINAM COM "ASYNC",GERALMENTE USAM IOCP FileStream#ReadAsyncHttpClient#GetStringAsync Socket#SendAsync
  52. 52. OBRIGADO!TWITTER.COM/JUANPLOPESGITHUB.COM/JUANPLOPES

×