Please consider the following code:
public async Task<string> GetString()
{
//Some code here...
var data = await A();
//Some more code...
return data;
}
private async Task<string> A()
{
//Some code here..
var data = await B();
//manipulating data...
return data;
}
private async Task<string> B()
{
//Some code here..
var data = await C();
//manipulating data...
return data;
}
private async Task<string> C()
{
//Some code here..
var data = await FetchFromDB();
//manipulating data...
return data;
}
private async Task<string> FetchFromDB()
{
return await SOME_HTTP_REQUEST;
}
This code demonstrate a most basic functionality - nested async methods. Will every method get translate into a state machine? Or is the compiler sophisticated enough to generate a more efficient structure? In some of my projects, there are ~20 methods between the UI/WebAPI and the I/O call - does that affect the trade-off between the async-await overhead (such as the state machine) and the non-blocking thread benefits? I mean, if, for example, the overhead of 4 state machines (4 nested async methods) equals to 50ms of blocking I/O (in terms of trade-off), will 20 state machine be equal to longer I/O's delay (250ms)?