5. Motivação
• Aplicações cada vez mais conectados
– Mais de latência
– Mais problemas de interface do usuário
responsividade
– Mais problemas de escalabilidade
• A programação assíncrona
– Se tornando a obrigatorio em
resposividade, aplicativos escaláveis
– Puro async APIs, por exemplo, JS e Silverlight
7. Assíncrono resumido
• Sincrono Espera o resultado antes de retornar
– string DownloadString(...);
• Assincrono Retorna imediatamente, chama
• callback com resultado
– void DownloadStringAsync(..., Action<string> callback);
• Beneficios
– UI responsiva: Libera a UI
– Escalabilidade: Thread pode ser reutilizada para outras solicitações
8. Síncrona contra Assíncrona
var data = Baixar(...);
Processar(data);
Baixar Processar
BaixarAsync(... , data => {
Processar (data);
});
BaixarAsync Processar
9. Síncrona contra Assíncrona
var data = DownloadData(...);
Baixar(...);
Processar(data);
ProcessData(data);
Baixar Processar
BaixarAsync(... , data => {
Processar (data);
});
Baixar Processar
11. 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;
}
12. 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;
} 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;
});
}
13. Como isso funciona?
async Task<XElement> Task<XElement> GetRssAsync(string url) {
var $builder =
GetRssAsync(string url) { AsyncTaskMethodBuilder<XElement>.Create();
var client = new WebClient(); $state = 0;
var
var task = TaskAwaiter<string> $a1;
Action $resume = delegate {
client.DownloadStringTaskAsync(url); {
try
var text = await task; if ($state == 1) goto L1;
var xml = XElement.Parse(text); var client = new WebClient();
var task = client.DownloadStringTaskAsync(url);
return xml; $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;
}
14. Como isso funciona?
async Task<XElement> Task<XElement> GetRssAsync(string url) {
var $builder =
GetRssAsync(string url) { AsyncTaskMethodBuilder<XElement>.Create();
var client = new WebClient(); $state = 0;
var
var task = TaskAwaiter<string> $a1;
Action $resume = delegate {
client.DownloadStringTaskAsync(url); {
try
var text = await task; if ($state == 1) goto L1;
var xml = XElement.Parse(text); var client = new WebClient();
var task = client.DownloadStringTaskAsync(url);
return xml; $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;
}