comtec 2012 - c# async

16
Trilha: DEV Programação Assíncrona com C# 5 Alberto Monteiro Email: [email protected] Twitter: @AibertoMonteiro Blog: http://blog.albertomonteiro.net.br

Upload: alberto-monteiro

Post on 27-Nov-2014

605 views

Category:

Technology


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Comtec 2012 - C# Async

Trilha: DEV

Programação Assíncrona com

C# 5Alberto MonteiroEmail: [email protected]: @AibertoMonteiroBlog: http://blog.albertomonteiro.net.br

Page 2: Comtec 2012 - C# Async

Parceiros

Page 3: Comtec 2012 - C# Async

Agenda Evoluçao

Motivação

Evolução atual

Breve resumo

Sincrono vs Assíncrono

Como funciona

Suporte

Duvidas?!

Page 4: Comtec 2012 - C# Async

Evolução

C# 1.0 + VB 7.0Managed Code

C# 2.0 + VB 8.0Generics

C# 3.0 + VB 9.0Language Integrated Query

C# 4.0 + VB 10.0Dynamic + Language Parity

Page 5: Comtec 2012 - C# Async

Motivação

Aplicações cada vez mais conectadosMais de latênciaMais problemas de interface do usuário responsividadeMais problemas de escalabilidade

A programação assíncronaSe tornando a obrigatorio em resposividade, aplicativos escaláveisPuro async APIs, por exemplo, JS e Silverlight

Page 6: Comtec 2012 - C# Async

Evolução

Managed Code

Generics

Language Integrated Query

Dynamic + Language Parity

C# + VB v.NextAsynchronous Programming

C# 1.0 + VB 7.0

C# 2.0 + VB 8.0

C# 3.0 + VB 9.0

C# 4.0 + VB 10.0

Page 7: Comtec 2012 - C# Async

Assíncrono resumido

Sincrono Espera o resultado antes de retornarstring DownloadString(...);

Assincrono Retorna imediatamente, chama callback com resultado

void DownloadStringAsync(..., Action<string> callback);

BeneficiosUI responsiva: Libera a UIEscalabilidade: Thread pode ser reutilizada para outras solicitações

Page 8: Comtec 2012 - C# Async

Síncrona contra Assíncrona

Thread

var data = Baixar(...);Processar(data);

BaixarAsync(... , data => { Processar (data);});

Thread

BaixarAsync Processar

STOP

ProcessarBaixar

Page 9: Comtec 2012 - C# Async

Síncrona contra Assíncrona

Thread

var data = DownloadData(...);ProcessData(data);

Thread

BaixarAsync Processar

STOP

ProcessarBaixar

STOP

var data = Baixar(...);Processar(data);

BaixarAsync(... , data => { Processar (data);});

Page 10: Comtec 2012 - C# Async

UI Responsiva

DEMO

Anders Hejlsberg
No exception stuff with old style codeUse undo to get backStart async by adding Task<Movie[]>await yields control to UI thread while waitingNo extra threads!!!type exception handling code, don't pasteTask.Run when you have something that actually takes a lot of timeMention VB!!!
Page 11: Comtec 2012 - C# Async

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

Page 12: Comtec 2012 - C# Async

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

Como isso funciona?

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

Page 13: Comtec 2012 - C# Async

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

Como isso funciona?

Task<XElement> GetRssAsync(string url) { var $builder = AsyncTaskMethodBuilder<XElement>.Create(); var $state = 0; TaskAwaiter<string> $a1; Action $resume = delegate { try { if ($state == 1) goto L1; var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); $a1 = task.GetAwaiter(); 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;}

Page 14: Comtec 2012 - C# Async

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

Como isso funciona?

Task<XElement> GetRssAsync(string url) { var $builder = AsyncTaskMethodBuilder<XElement>.Create(); var $state = 0; TaskAwaiter<string> $a1; Action $resume = delegate { try { if ($state == 1) goto L1; var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); $a1 = task.GetAwaiter(); 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;}

Page 15: Comtec 2012 - C# Async

Suporte pelo .NET

TaskParallelLibrary

WindowsCommunicationFoundation

ReactiveExtensions(Rx)

BaseClassLibrary Outros

Page 16: Comtec 2012 - C# Async

Alberto MonteiroEmail: [email protected]: @AibertoMonteiroBlog: http://blog.albertomonteiro.net.br

DUVIDAS?!