Do meu entendimento uma das principais coisas que async
e await
fazem é tornar o código fácil de escrever e ler - mas será que utilizá-los é igual a desovar fios de fundo para executar uma lógica de longa duração?
I'estou actualmente a experimentar o exemplo mais básico. I'adicionei alguns comentários em linha. Você pode me esclarecer isso?
// I don't understand why this method must be marked as `async`.
private async void button1_Click(object sender, EventArgs e)
{
Task<int> access = DoSomethingAsync();
// task independent stuff here
// this line is reached after the 5 seconds sleep from
// DoSomethingAsync() method. Shouldn't it be reached immediately?
int a = 1;
// from my understanding the waiting should be done here.
int x = await access;
}
async Task<int> DoSomethingAsync()
{
// is this executed on a background thread?
System.Threading.Thread.Sleep(5000);
return 1;
}
Além das outras respostas, dê uma olhada em await (C# Reference)
e mais especificamente no exemplo incluído, ele explica um pouco a sua situação
O seguinte exemplo de Windows Forms ilustra o uso da espera em um método async, WaitAsynchronouslyAsync. Contraste o comportamento desse método com o comportamento de WaitSynchronously. Sem uma espera operador aplicado a uma tarefa, WaitSynchronously funciona de forma síncrona apesar do uso do modificador de assimetria na sua definição e de uma chamada para Thread.Sleep in its body.
private async void button1_Click(object sender, EventArgs e)
{
// Call the method that runs asynchronously.
string result = await WaitAsynchronouslyAsync();
// Call the method that runs synchronously.
//string result = await WaitSynchronously ();
// Display the result.
textBox1.Text += result;
}
// The following method runs asynchronously. The UI thread is not
// blocked during the delay. You can move or resize the Form1 window
// while Task.Delay is running.
public async Task<string> WaitAsynchronouslyAsync()
{
await Task.Delay(10000);
return "Finished";
}
// The following method runs synchronously, despite the use of async.
// You cannot move or resize the Form1 window while Thread.Sleep
// is running because the UI thread is blocked.
public async Task<string> WaitSynchronously()
{
// Add a using directive for System.Threading.
Thread.Sleep(10000);
return "Finished";
}
Eu acho que você escolheu um mau exemplo com 'System.Threading.Threading.Threading.Sleep'.
O ponto de uma tarefa async
é deixá-la executar em segundo plano sem travar o fio principal, como fazer um DownloadFileAsync
.
Sistema.Threading.Threading.Threading.Sleep" não é algo que está "a ser feito", apenas dorme, e portanto a sua próxima linha é alcançada após 5 segundos ...
Leia este artigo, eu acho que é uma grande explicação do conceito async
e await
: http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx
Para ser honesto, ainda acho que a melhor explicação é aquela sobre o futuro e promessas na Wikipédia: http://en.wikipedia.org/wiki/Futures_and_promises
A idéia básica é que você tenha um pool separado de tópicos que executam tarefas de forma assíncrona. Ao utilizá-lo. O objeto, no entanto, faz a promessa de que executará a operação em algum momento e lhe dará o resultado quando você o solicitar. Isto significa que ele bloqueará quando você solicitar o resultado e não tiver terminado, mas executará no pool de threads de outra forma.
A partir daí você pode otimizar as coisas: algumas operações podem ser implementadas assimetricamente e você pode otimizar coisas como IO de arquivo e comunicação em rede, agrupando os pedidos subsequentes e/ou reordenando-os. Não tenho certeza se isso já está no framework de tarefas da Microsoft - mas se não estiver, essa seria uma das primeiras coisas que eu adicionaria.
Você pode realmente implementar a futura classificação de padrões com rendimentos em C# 4.0. Se você quiser saber como funciona exatamente, eu posso recomendar este link que faz um trabalho decente: http://code.google.com/p/fracture/source/browse/trunk/Squared/TaskLib/ . Entretanto, se você mesmo começar a brincar com ele, você vai notar que você realmente precisa de suporte linguístico se quiser fazer todas as coisas legais -- que é exatamente o que a Microsoft fez.