async/await state machine-ге қалай айналады
Компилятор async әдісін қалай өзгертетінін көріңіз: MoveNext шақырулары, await кезіндегі тоқтау, continuation жоспарлау және Task аяқталуы.
Ағымдағы кезең Дайын
Бастапқы async әдіс
Әзірлеуші жазатын код.
async Task<string> LoadProfileAsync()
{
Log("start");
var user = await GetUserAsync();
var score = await GetScoreAsync(user);
return $"{user}: {score}";
} Компилятор жасаған state machine
Құрылым тоқтаулар арасында сақталып, жергілікті айнымалыларды өрістерде ұстайды.
var machine = new <LoadProfileAsync>d__0();
machine.MoveNext();
state = 0; builder.AwaitUnsafeOnCompleted(...);
awaiter.GetResult(); state = -1;
state = 1; builder.AwaitUnsafeOnCompleted(...);
state = -2; builder.SetResult(result); Runtime орындалуы
I/O күтілгенде ағын босайды, ал орындалу күйін state machine сақтайды.
1Шақырушы код
2MoveNext()
3Пайдаланушы I/O
4Continuation кезегі
5Рейтинг I/O
6SetResult()
Әдіс әлі шақырылған жоқ: state machine және Task жоқ.