Let me add it to something simpler:
async static void Go()
{
await Something();
Go();
await SomethingElse();
}
How does the compiler handle this?
It basically becomes something like this sketch:
class HelperClass
{
private State state = STARTSTATE;
public void DoIt()
{
if (state == STARTSTATE) goto START;
if (state == AFTERSOMETHINGSTATE) goto AFTERSOMETHING;
if (state == AFTERSOMETHINGELSESTATE) goto AFTERSOMETHINGELSE;
START:
{
state = AFTERSOMETHINGSTATE;
var awaiter = Something().MakeAnAwaiter();
awaiter.WhenDoneDo(DoIt);
return;
}
AFTERSOMETHING:
{
Go();
state = AFTERSOMETHINGELSESTATE;
var awaiter = SomethingElse().MakeAnAwaiter();
awaiter.WhenDoneDo(DoIt);
return;
}
AFTERSOMETHINGELSE:
return;
}
static void Go()
{
var helper = new HelperClass();
helper.DoIt();
}
, , , , "DoIt" (, ).
? . Go . DoIt. Something(), , awaiter , awaiter " , helper1.DoIt" .
, helper1 DoIt. helper1 state AFTERSOMETHINGSTATE, goto Go. helper2 DoIt. Something(), , awaiter , awaiter " , DoIt helper2" helper1 DoIt. SomethingElse, awaiter " - , helper1 DoIt". .
. . , SomethingElse . helper1.DoIt(), . Helper1 .
helper2.DoIt() AFTERSOMETHING. Go(), helper3...
, , . , Go , Something(), . "-" . "Go" .