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.

Programação assíncrona com c sharp

892 views

Published on

Programação assíncrona com C#

  • Login to see the comments

Programação assíncrona com c sharp

  1. 1. Programação assíncrona com C# 5 André Bires @ Take.net Janeiro de 2014
  2. 2. Il Pizzeria Ritardato
  3. 3. Pizzeria Ritardato 5 garçons 10 mesas
  4. 4. Pizzeria Ritardato Garçom espera na cozinha o pedido
  5. 5. Pizzeria Ritardato + de 5 pedidos = Clientes esperando
  6. 6. Pizzeria Ritardato Contratação de + 5 garçons Total = 10
  7. 7. Pizzeria Ritardato Custo > Receita = Prejuízos
  8. 8. Il Pizzeria Veloce
  9. 9. Pizzeria Veloce 3 garçons 10 mesas
  10. 10. Pizzeria Veloce Garçom leva pedido na cozinha e volta para o balcão
  11. 11. Pizzeria Veloce Campainha Garçom pedido != garçom entrega
  12. 12. Pizzeria Veloce Aumento da freguesia 3 garçons + que suficientes Ampliação para 15 mesas
  13. 13. Pizzeria Veloce Mesmo custo com Maior receita = Maior eficiência
  14. 14. ?
  15. 15. !
  16. 16. Programação assíncrona Uso eficiente dos recursos computacionais
  17. 17. NUNCA bloquear uma thread
  18. 18. Thread bloqueada = Dinheiro jogado fora
  19. 19. Thread bloqueada = Destruição da natureza
  20. 20. Programação assíncrona Retorno ao threadpool Notificação de conclusão
  21. 21. Não é o mesmo que programação paralela!
  22. 22. Programação assíncrona Pizzaria: Servidor Mesa/cliente: Aplicação Garçom: Thread Salário do garçom: Memória da thread Balcão: Thread pool
  23. 23. Programação assíncrona Pedido: Requisição externa Pizzaiolo: Serviço externo Pizza: Resultado da requisição Campainha: Notificação
  24. 24. Programação assíncrona com C# 5
  25. 25. Programação assíncrona com C# Asynchronous Programming Model (APM)
  26. 26. Programação assíncrona com C# Asynchronous Programming Model (APM) Event-based Asynchronous Pattern (EAP)
  27. 27. Programação assíncrona com C# Asynchronous Programming Model (APM) Event-based Asynchronous Pattern (EAP) Task-based Asynchronous Pattern (TAP)
  28. 28. Programação assíncrona com C# Asynchronous Programming Model (APM) Event-based Asynchronous Pattern (EAP) Task-based Asynchronous Pattern (TAP)
  29. 29. Task-based Asynchronous Pattern Task ou Task<T> C# 4 Task = Promisse ou Future
  30. 30. Task-based Asynchronous Pattern () => { } Threadpool
  31. 31. Task-based Asynchronous Pattern private void Example1Button_Click(object sender, EventArgs e)  {      toolStripStatusLabel.Text = "Calling the API...";      Task<string> task = Task.Run(() => GetName(1));      nameTextBox.Text = task.Result;      toolStripStatusLabel.Text = "Done";  }
  32. 32. Task-based Asynchronous Pattern private void Example1Button_Click(object sender, EventArgs e)  {      toolStripStatusLabel.Text = "Calling the API...";      Task<string> task = Task.Run(() => GetName(1));      nameTextBox.Text = task.Result;      toolStripStatusLabel.Text = "Done";  }
  33. 33. Task-based Asynchronous Pattern ContinueWith
  34. 34. Task-based Asynchronous Pattern private void Example2Button_Click(object sender, EventArgs e)  {      toolStripStatusLabel.Text = "Calling the API...";      Task.Run(() => GetName(1))      .ContinueWith(t =>          this.Invoke(new Action(() =>              {                  nameTextBox.Text = t.Result;                  toolStripStatusLabel.Text = "Done";              }))      ); }
  35. 35. Task-based Asynchronous Pattern private void Example2Button_Click(object sender, EventArgs e)  {      toolStripStatusLabel.Text = "Calling the API...";      Task.Run(() => GetName(1))      .ContinueWith(t =>          this.Invoke(new Action(() =>              {                  nameTextBox.Text = t.Result;                  toolStripStatusLabel.Text = "Done";              }))      ); }
  36. 36. Task-based Asynchronous Pattern private void Example2Button_Click(object sender, EventArgs e)  {      toolStripStatusLabel.Text = "Calling the API...";      Task.Run(() => GetName(1))      .ContinueWith(t =>          this.Invoke(new Action(() =>              {                  nameTextBox.Text = t.Result;                  toolStripStatusLabel.Text = "Done";              }))      ); }
  37. 37. Task-based Asynchronous Pattern private void Example2Button_Click(object sender, EventArgs e)  {      toolStripStatusLabel.Text = "Calling the API...";      Task.Run(() => GetName(1))      .ContinueWith(t =>          this.Invoke(new Action(() =>              {                  nameTextBox.Text = t.Result;                  toolStripStatusLabel.Text = "Done";              }))      ); }
  38. 38. Task-based Asynchronous Pattern private void Example1Button_Click(object sender, EventArgs e)  {      toolStripStatusLabel.Text = "Calling the API...";      for (int i = 0; i < repeatNumericUpDown.Value; i++)      {          Task<string> task = Task.Run(() => GetName(1));          nameTextBox.AppendText(task.Result);          nameTextBox.AppendText(Environment.NewLine);      }      toolStripStatusLabel.Text = "Done";  }
  39. 39. private void Example2Button_Click(object sender, EventArgs e)  {      toolStripStatusLabel.Text = "Calling the API...";      GetNames(Convert.ToInt32(repeatNumericUpDown.Value)); }  private void GetNames(int remaining)  {      Task.Run(() => GetName(1))          .ContinueWith(t =>              this.Invoke(new Action(() =>                  {                      nameTextBox.AppendText(t.Result);                      nameTextBox.AppendText(Environment.NewLine);                      remaining--;                      if (remaining > 0)                      {                          GetNames(remaining);                      }                      else                      {                          toolStripStatusLabel.Text = "Done";                      }                   })              )          );  }
  40. 40. Task-based Asynchronous Pattern C# 5.0 (.NET 4.5)
  41. 41. async
  42. 42. await
  43. 43. Task-based Asynchronous Pattern Método I/O que retorne uma Task Event handler assíncrono
  44. 44. Task-based Asynchronous Pattern private async void Example3Button_Click(object sender, EventArgs e)  {      toolStripStatusLabel.Text = "Calling the API...";      nameTextBox.Text = await GetNameAsync(1);      toolStripStatusLabel.Text = "Done";  }
  45. 45. Task-based Asynchronous Pattern private async void Example3Button_Click(object sender, EventArgs e)  {      toolStripStatusLabel.Text = "Calling the API...";      for (int i = 0; i < repeatNumericUpDown.Value; i++)      {          nameTextBox.AppendText(await GetNameAsync(1));          nameTextBox.AppendText(Environment.NewLine);      }      toolStripStatusLabel.Text = "Done";  }
  46. 46. Task-based Asynchronous Pattern private async void Example3Button_Click(object sender, EventArgs e)  {      toolStripStatusLabel.Text = "Calling the API...";      nameTextBox.Text = await GetNameAsync(1);      toolStripStatusLabel.Text = "Done";  }
  47. 47. Task-based Asynchronous Pattern private async void Example3Button_Click(object sender, EventArgs e)  {      toolStripStatusLabel.Text = "Calling the API...";      nameTextBox.Text = await GetNameAsync(1);      toolStripStatusLabel.Text = "Done";  }
  48. 48. Task-based Asynchronous Pattern private async void Example3Button_Click(object sender, EventArgs e)  {      toolStripStatusLabel.Text = "Calling the API...";      nameTextBox.Text = await GetNameAsync(1);      toolStripStatusLabel.Text = "Done";  } Primeiro estado Segundo estado
  49. 49. Task-based Asynchronous Pattern
  50. 50. Overhead !
  51. 51. Task-based Asynchronous Pattern API verdadeiramente assíncronas = Completion port (Windows)
  52. 52. Task-based Asynchronous Pattern TcpClient HttpClient Socket Etc.
  53. 53. Task-based Asynchronous Pattern Async wrappers = EVIL
  54. 54. Task-based Asynchronous Pattern private Task<string> GetNameAsyncWrapper(int id) {      return Task.Run(() =>      {          return GetName(id);      }); }  private string GetName(int id)  {      // Synchronous implemementation  }
  55. 55. Task-based Asynchronous Pattern private Task<string> GetNameAsyncWrapper(int id) {      return Task.Run(() =>      {          return GetName(id);      }); }  private string GetName(int id)  {      // Synchronous implemementation  }
  56. 56. Task-based Asynchronous Pattern private async Task<string> GetNameAsync(int id) {     string url = string.Format("http://localhost:3803/names/{0}", id);       using (var client = new HttpClient())     {         var httpResponseMessage = await client.GetAsync(url);           if (httpResponseMessage.IsSuccessStatusCode)         {             return await httpResponseMessage.Content                 .ReadAsStringAsync();         }         else         {             return httpResponseMessage.ReasonPhrase;         }     } }
  57. 57. Task-based Asynchronous Pattern Código legado requer muitas alterações
  58. 58. async = infecçã o
  59. 59. Task-based Asynchronous Pattern public string Get(int id, bool delay = false) {      if (delay)      {          // Simula uma chamada externa, como banco de dados          Thread.Sleep(3000);      }      return string.Format(          "{0} {1}",          _firstNames[_random.Next(_firstNames.Length - 1)],          _lastNames[_random.Next(_lastNames.Length - 1)]);  }
  60. 60. Task-based Asynchronous Pattern public async Task<string> GetAsync(int id, bool delay = false)  {      if (delay)      {          // Simula uma chamada externa, como banco de dados          await Task.Delay(3000);      }      return string.Format(          "{0} {1}",          _firstNames[_random.Next(_firstNames.Length - 1)],          _lastNames[_random.Next(_lastNames.Length - 1)]);  }
  61. 61. Task-based Asynchronous Pattern Boas práticas: async void apenas em event handlers ConfigureAwait(false) em bibliotecas
  62. 62. Task-based Asynchronous Pattern Callstack é diferente do código síncrono
  63. 63. ?

×