Transcript
Page 1: Programação assíncrona com c sharp

Programação assíncrona com C# 5André Bires @ Take.netJaneiro de 2014

Page 2: Programação assíncrona com c sharp

Il Pizzeria Ritardato

Page 3: Programação assíncrona com c sharp

Pizzeria Ritardato 5 garçons 10 mesas

Page 4: Programação assíncrona com c sharp

Pizzeria Ritardato Garçom espera na cozinha o pedido

Page 5: Programação assíncrona com c sharp

Pizzeria Ritardato + de 5 pedidos = Clientes esperando

Page 6: Programação assíncrona com c sharp

Pizzeria Ritardato Contratação de + 5 garçons Total = 10

Page 7: Programação assíncrona com c sharp

Pizzeria Ritardato Custo > Receita = Prejuízos

Page 8: Programação assíncrona com c sharp

Il Pizzeria Veloce

Page 9: Programação assíncrona com c sharp

Pizzeria Veloce 3 garçons 10 mesas

Page 10: Programação assíncrona com c sharp

Pizzeria Veloce Garçom leva pedido na cozinha e volta para o balcão

Page 11: Programação assíncrona com c sharp

Pizzeria Veloce Campainha Garçom pedido != garçom entrega

Page 12: Programação assíncrona com c sharp

Pizzeria Veloce Aumento da freguesia 3 garçons + que suficientes Ampliação para 15 mesas

Page 13: Programação assíncrona com c sharp

Pizzeria Veloce Mesmo custo com Maior receita = Maior eficiência

Page 14: Programação assíncrona com c sharp

?

Page 15: Programação assíncrona com c sharp

!

Page 16: Programação assíncrona com c sharp

Programação assíncrona Uso eficiente dos recursos computacionais

Page 17: Programação assíncrona com c sharp

NUNCA bloquear uma thread

Page 18: Programação assíncrona com c sharp

Thread bloqueada = Dinheiro jogado fora

Page 19: Programação assíncrona com c sharp

Thread bloqueada = Destruição da natureza

Page 20: Programação assíncrona com c sharp

Programação assíncrona Retorno ao threadpool Notificação de conclusão

Page 21: Programação assíncrona com c sharp

Não é o mesmo que programação paralela!

Page 22: Programação assíncrona com c sharp

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

Page 23: Programação assíncrona com c sharp

Programação assíncrona Pedido: Requisição externa Pizzaiolo: Serviço externo Pizza: Resultado da requisição Campainha: Notificação

Page 24: Programação assíncrona com c sharp

Programação assíncrona com C# 5

Page 25: Programação assíncrona com c sharp

Programação assíncrona com C# Asynchronous Programming Model

(APM)

Page 26: Programação assíncrona com c sharp

Programação assíncrona com C# Asynchronous Programming Model

(APM) Event-based Asynchronous Pattern

(EAP)

Page 27: Programação assíncrona com c sharp

Programação assíncrona com C# Asynchronous Programming Model

(APM) Event-based Asynchronous Pattern

(EAP) Task-based Asynchronous Pattern (TAP)

Page 28: Programação assíncrona com c sharp

Programação assíncrona com C# Asynchronous Programming Model

(APM) Event-based Asynchronous Pattern

(EAP) Task-based Asynchronous Pattern (TAP)

Page 29: Programação assíncrona com c sharp

Task-based Asynchronous Pattern Task ou Task<T> C# 4 Task = Promisse ou Future

Page 30: Programação assíncrona com c sharp

Task-based Asynchronous Pattern () => { } Threadpool

Page 31: Programação assíncrona com c sharp

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"; }

Page 32: Programação assíncrona com c sharp

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"; }

Page 33: Programação assíncrona com c sharp

Task-based Asynchronous Pattern ContinueWith

Page 34: Programação assíncrona com c sharp

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";             }))     );}

Page 35: Programação assíncrona com c sharp

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";             }))     );}

Page 36: Programação assíncrona com c sharp

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";             }))     );}

Page 37: Programação assíncrona com c sharp

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";             }))     );}

Page 38: Programação assíncrona com c sharp

Task-based Asynchronous Patternprivate 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"; }

Page 39: Programação assíncrona com c sharp

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";                     }                  })             )         ); }

Page 40: Programação assíncrona com c sharp

Task-based Asynchronous Pattern C# 5.0 (.NET 4.5)

Page 41: Programação assíncrona com c sharp

async

Page 42: Programação assíncrona com c sharp

await

Page 43: Programação assíncrona com c sharp

Task-based Asynchronous Pattern Método I/O que retorne uma Task Event handler assíncrono

Page 44: Programação assíncrona com c sharp

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"; }

Page 45: Programação assíncrona com c sharp

Task-based Asynchronous Patternprivate 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"; }

Page 46: Programação assíncrona com c sharp

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"; }

Page 47: Programação assíncrona com c sharp

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"; }

Page 48: Programação assíncrona com c sharp

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

Page 49: Programação assíncrona com c sharp

Task-based Asynchronous Pattern

Page 50: Programação assíncrona com c sharp
Page 51: Programação assíncrona com c sharp

Overhead!

Page 52: Programação assíncrona com c sharp

Task-based Asynchronous Pattern API verdadeiramente assíncronas = Completion port (Windows)

Page 53: Programação assíncrona com c sharp

Task-based Asynchronous Pattern TcpClient HttpClient Socket Etc.

Page 54: Programação assíncrona com c sharp

Task-based Asynchronous Pattern Async wrappers = EVIL

Page 55: Programação assíncrona com c sharp

private Task<string> GetNameAsyncWrapper(int id){     return Task.Run(() =>     {         return GetName(id);     });}

private string GetName(int id) { // Synchronous implemementation }

Task-based Asynchronous Pattern

Page 56: Programação assíncrona com c sharp

private Task<string> GetNameAsyncWrapper(int id){     return Task.Run(() =>     {         return GetName(id);     });}

private string GetName(int id) { // Synchronous implemementation }

Task-based Asynchronous Pattern

Page 57: Programação assíncrona com c sharp

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;         }     } }

Task-based Asynchronous Pattern

Page 58: Programação assíncrona com c sharp

Task-based Asynchronous Pattern Código legado requer muitas alterações

Page 59: Programação assíncrona com c sharp

async =

infecção

Page 60: Programação assíncrona com c sharp

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)]); }

Task-based Asynchronous Pattern

Page 61: Programação assíncrona com c sharp

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)]); }

Task-based Asynchronous Pattern

Page 62: Programação assíncrona com c sharp

Task-based Asynchronous PatternBoas práticas: async void apenas em event handlers ConfigureAwait(false) em bibliotecas

Page 63: Programação assíncrona com c sharp

Task-based Asynchronous Pattern Callstack é diferente do código síncrono

Page 64: Programação assíncrona com c sharp

?


Top Related