Successfully reported this slideshow.

rioinfo2012

0

Share

Upcoming SlideShare
qconsp2015
qconsp2015
Loading in …3
×
1 of 53
1 of 53

More Related Content

Related Books

Free with a 14 day trial from Scribd

See all

Related Audiobooks

Free with a 14 day trial from Scribd

See all

rioinfo2012

  1. 1. PROGRAMAÇÃO CONCORRENTE EM .NET 4.5 JUAN LOPES twitter.com/juanplopes github.com/juanplopes
  2. 2. PROGRAMAÇÃO TALVEZ CONCORRENTE EM .NET 4.5 JUAN LOPES twitter.com/juanplopes github.com/juanplopes
  3. 3. PROGRAMAÇÃO ASSÍNCRONA EM .NET 4.5 JUAN LOPES twitter.com/juanplopes github.com/juanplopes
  4. 4. EU PROGRAMO WEB
  5. 5. EU PROGRAMO WEB POR QUE PROGRAMAR ASSINCRONAMENTE?
  6. 6. EU PROGRAMO WEB POR QUE PROGRAMAR ASSINCRONAMENTE? MENOR LATÊNCIA MAIOR RESPONSIVIDADE
  7. 7. WINDOWS XP WINDOWS FORMS NÃO BLOQUEIE A THREAD DA UI
  8. 8. WINDOWS 8 WINRT NÃO BLOQUEIE A THREAD DA UI
  9. 9. I/O vs CPU
  10. 10. I/O vs CPU I/O É MAIS CARO
  11. 11. I/O vs CPU I/O É MAIS LENTO
  12. 12. I/O vs CPU I/O É MAIS LENTO DISCO REDE BANCO DE DADOS
  13. 13. PROGRAMAÇÃO CONCORRENTE
  14. 14. PROGRAMAÇÃO CONCORRENTE THREADS
  15. 15. PROGRAMAÇÃO CONCORRENTE É DIFÍCIL
  16. 16. PROGRAMAÇÃO CONCORRENTE É 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.5 BeginInvoke EndInvoke
  22. 22. Func<string> ler = () => File.ReadAllText(@"C:test.txt"); var handle = ler.BeginInvoke(null, null); //qualquer outro código var resultado = ler.EndInvoke(handle);
  23. 23. var req = WebRequest.Create("http://google.com"); var handle = req.BeginGetRequestStream(null, null); //qualquer código var stream = req.EndGetRequestStream(handle);
  24. 24. ATÉ .NET 3.5 Begin[QualquerCoisa] End[QualquerCoisa]
  25. 25. ATÉ .NET 3.5 Begin[QualquerCoisa] End[QualquerCoisa] THREADS RACE CONDITIONS MAIS COMPLICADO
  26. 26. .NET 4.0 PARALLEL EXTENSIONS PLINQ (Parallel LINQ) + TPL (Task Parallel Library)
  27. 27. .NET 4.0 PLINQ (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.0 TPL (Task Parallel Library)
  30. 30. .NET 4.0 TPL (Task Parallel Library) Task<T>
  31. 31. var task = Task.Run(() => File.ReadAllText(@"C:test.txt")); //qualquer outro código var resultado = task.Result;
  32. 32. .NET 4.0 TPL (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 THREADS SEM RACE CONDITIONS MUITO 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 THREAD private 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 THREADS BLOQUEADAS EM I/O?
  45. 45. ENTÃO CONTINUAMOS COM THREADS BLOQUEADAS EM I/O? NÃO
  46. 46. IOCP
  47. 47. IOCP I/O COMPLETION PORTS FUNCIONALIDADE DO S.O. ASYNC "THREADLESS" I/O
  48. 48. NÃO HÁ THREADS BLOQUEADAS ESPERANDO CADA I/O TERMINAR
  49. 49. NÃO HÁ THREADS BLOQUEADAS ESPERANDO CADA I/O TERMINAR HÁ UMA ÚNICA THREAD DE IO QUE LÊ UMA FILA
  50. 50. MÉTODOS DA BCL QUE TERMINAM COM "ASYNC", GERALMENTE USAM IOCP
  51. 51. MÉTODOS DA BCL QUE TERMINAM COM "ASYNC", GERALMENTE USAM IOCP FileStream#ReadAsync HttpClient#GetStringAsync Socket#SendAsync
  52. 52. OBRIGADO! TWITTER.COM/JUANPLOPES GITHUB.COM/JUANPLOPES

×