Прочитал много литературы но пока никак не могу понять как работает await и async. Ну хоть убейте. Везде примеры с httpclient, но для меня они не понятны. Пытаюсь разобраться сам.
Вот что я понял:
Как только наш код встречает await происходит возврат управления. После завершения ожидаемой операции метод восстанавливается. Точнее продолжает выполнение с того места, на котором остановился, когда столкнулся с await.
Хорошо, я написал пару строк кода(возможно просто что-то сделал не так)
async Task myMethod() {
int sum = 0;
await SomeCycleAsync();
Console.WriteLine("выполнился цикл2");
}
async Task SomeCycleAsync() {
var myTask = await ResultOfCycle();
Console.WriteLine("выполнился цикл1");
}
async Task < int > ResultOfCycle() {
int sum = 0;
for (int i = 0; i < 1000000000; i++) {
sum += i;
}
return sum;
}
private void Form1_Load(object sender, EventArgs e) {
myMethod();
}
В методе
myMethodвстречается словоawaitи, на сколько я понимаю, управление должна перейти обратно вform_load, верно?Во время выполнения метода
SomeCycleAsyncвстречаетсяawait, т.е. по логике управление должно перейти кConsole.WriteLine("выполнился цикл2");Но результат работы такой:
выполнился цикл1
выполнился цикл2
Объясните мне пожалуйста почему? Совсем не понимаю
В методе myMethod встречается слово await и на сколько я понимаю управление должна перейти обратно в form_load, верно?
– etki May 02 '14 at 00:15await- это оператор, который говорит "ждать, пока не будет получен результат". Управление не переходит куда-то - поток в этот момент останавливается и ждет, покаSomeCycleAsyncне вернет результат. Весь смысл в том, чтобы отправить задание на обработку, заняться своими делами, и вызватьawaitтолько тогда, когда необходим результат асинхронной функции. Так можно довольно гибко работать с тормозными операциями без блокирования и полноценной многопоточности.