Код в вашем TryDoSomethingAsync
преобразуется компилятором в код IL, который более или менее эквивалентен этому:
public Task<bool> TryDoSomethingAsync()
{
TryDoSomethingAsyncStateMachine stateMachine = new TryDoSomethingAsyncStateMachine();
stateMachine._this = this;
stateMachine._builder = AsyncTaskMethodBuilder<bool>.Create();
stateMachine._state = -1;
AsyncTaskMethodBuilder<bool> _builder = stateMachine._builder;
_builder.Start(ref stateMachine);
return stateMachine._builder.Task;
}
private sealed class TryDoSomethingAsyncStateMachine : IAsyncStateMachine
{
public int _state;
public AsyncTaskMethodBuilder<bool> _builder;
public UserQuery _this;
private TaskAwaiter _awaiter;
private void MoveNext()
{
int num = _state;
bool result;
try
{
TaskAwaiter awaiter;
if (num == 0)
{
awaiter = _awaiter;
_awaiter = default(TaskAwaiter);
num = (_state = -1);
goto IL_0080;
}
if (!_this.Is99PercentOfTheCases())
{
awaiter = _this.DoSomethingAsync().GetAwaiter();
if (!awaiter.IsCompleted)
{
num = (_state = 0);
_awaiter = awaiter;
TryDoSomethingAsyncStateMachine stateMachine = this;
_builder.AwaitUnsafeOnCompleted(ref awaiter, ref stateMachine);
return;
}
goto IL_0080;
}
result = false;
goto end_IL_0007;
IL_0080:
awaiter.GetResult();
result = true;
end_IL_0007:;
}
catch (Exception exception)
{
_state = -2;
_builder.SetException(exception);
return;
}
_state = -2;
_builder.SetResult(result);
}
void IAsyncStateMachine.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
this.MoveNext();
}
[DebuggerHidden]
private void SetStateMachine(IAsyncStateMachine stateMachine)
{
}
void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
{
//ILSpy generated this explicit interface implementation from .override directive in SetStateMachine
this.SetStateMachine(stateMachine);
}
}
Выполняется значительно больше кода, чем простой asyn c method.
Однако код, который запускает Is99PercentOfTheCases()
, по-прежнему довольно легкий. Это будет быстро, но не так быстро, как неасинхронный метод c.