Ключевые слово async/await C#
Допустим есть int - ключевое слово для System.Int32. Есть string - ключевое слово для System.String. А есть async и await, это ключевые слова для каких классов? Пытался искать в microsoft reference source, но там нашел только private bool async
Ответы (1 шт):
Для .NET 5/6 вместо Reference Source (он содержит устаревший код .NET Framework 4.8) используйте лучше Github - https://github.com/dotnet/runtime или вот такой сайт еще есть https://source.dot.net.
Если хочется узнать, что же на самом деле такое async, то можно открыть https://sharplab.io и выбрать C# в дропдауне Results
Там такой код слева
public void M() {
}
И если его изменить на
public async void M() {
}
То справа получится вот такая конструкция
[StructLayout(LayoutKind.Auto)]
[CompilerGenerated]
private struct <M>d__0 : IAsyncStateMachine
{
public int <>1__state;
public AsyncVoidMethodBuilder <>t__builder;
private void MoveNext()
{
try
{
}
catch (Exception exception)
{
<>1__state = -2;
<>t__builder.SetException(exception);
return;
}
<>1__state = -2;
<>t__builder.SetResult();
}
void IAsyncStateMachine.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
this.MoveNext();
}
[DebuggerHidden]
private void SetStateMachine(IAsyncStateMachine stateMachine)
{
<>t__builder.SetStateMachine(stateMachine);
}
void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
{
//ILSpy generated this explicit interface implementation from .override directive in SetStateMachine
this.SetStateMachine(stateMachine);
}
}
[AsyncStateMachine(typeof(<M>d__0))]
public void M()
{
<M>d__0 stateMachine = default(<M>d__0);
stateMachine.<>t__builder = AsyncVoidMethodBuilder.Create();
stateMachine.<>1__state = -1;
stateMachine.<>t__builder.Start(ref stateMachine);
}
Вот она, асинхронная машина состояний.
Теперь await.
public async void M() {
await Task.Delay(1000);
}
Он добавляет поле и изменяет метод MoveNext()
private TaskAwaiter <>u__1;
private void MoveNext()
{
int num = <>1__state;
try
{
TaskAwaiter awaiter;
if (num != 0)
{
awaiter = Task.Delay(1000).GetAwaiter();
if (!awaiter.IsCompleted)
{
num = (<>1__state = 0);
<>u__1 = awaiter;
<>t__builder.AwaitUnsafeOnCompleted(ref awaiter, ref this);
return;
}
}
else
{
awaiter = <>u__1;
<>u__1 = default(TaskAwaiter);
num = (<>1__state = -1);
}
awaiter.GetResult();
}
catch (Exception exception)
{
<>1__state = -2;
<>t__builder.SetException(exception);
return;
}
<>1__state = -2;
<>t__builder.SetResult();
}
Вот так на самом деле выглядит await.
Как видно, эти 2 ключевых слова хоть и являются "ненастоящими", а преобразуются в другой код, но они совсем не похожи на классы.
Если понравилась методика исследования, то изучите во что превращается реализация итератора IEnumerable<T> с yield return. Там тоже интересно.