Доколкото разбирам, едно от основните неща, които async
и await
правят, е да улеснят писането и четенето на код - но дали използването им е равносилно на създаване на фонови нишки за изпълнение на логически задачи с голяма продължителност?
В момента изпробвам най-елементарния пример. Добавих няколко коментара в текста. Можеш ли да ми го разясниш?
// 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;
}
В допълнение към другите отговори, погледнете await (C# Reference)
и по-конкретно включения пример, който обяснява малко вашата ситуация
Следващият пример за Windows Forms илюстрира използването на await в async метод, WaitAsynchronouslyAsync. Съпоставете поведението на този метод с поведението на WaitSynchronously. Без await , приложен към задачата, WaitSynchronously работи синхронно въпреки използването на модификатора async в дефиницията му и повикването на Thread.Sleep в нейното тяло.
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";
}
Мисля, че сте избрали лош пример с System.Threading.Thread.Sleep
Смисълът на async
задачата е да се позволи да се изпълнява във фонов режим, без да се заключва основната нишка, като например да се направи DownloadFileAsync
System.Threading.Thread.Sleep
не е нещо, което се "извършва", а просто спи и затова следващият ред се достига след 5 секунди...
Прочетете тази статия, мисля, че е чудесно обяснение на концепцията за async
и await
: http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx
Честно казано, все още смятам, че най-доброто обяснение е това за бъдещето и обещанията в Уикипедия: http://en.wikipedia.org/wiki/Futures_and_promises
Основната идея е, че имате отделен пул от нишки, които изпълняват задачи асинхронно. Когато го използвате. Обектът обаче дава обещание, че ще изпълни операцията в определен момент и ще ви даде резултата, когато го поискате. Това означава, че той ще блокира, когато поискате резултата и не е завършил, но в противен случай ще изпълнява в пула от нишки.
Оттук нататък можете да оптимизирате нещата: някои операции могат да се изпълняват асинхронно и можете да оптимизирате неща като файловия вход и мрежовата комуникация, като обединявате последователните заявки и/или ги пренареждате. Не съм сигурен дали това вече е заложено в рамката за задачи на Microsoft - но ако не е, това би било едно от първите неща, които бих добавил.
Всъщност можете да реализирате шаблона на бъдещето в известен смисъл с yields в C# 4.0. Ако искате да разберете как точно работи, мога да ви препоръчам този линк, който върши прилична работа: http://code.google.com/p/fracture/source/browse/trunk/Squared/TaskLib/ . Ако обаче започнете сами да си играете с него, ще забележите, че наистина се нуждаете от езикова поддръжка, ако искате да правите всички готини неща - точно това са направили Microsoft.