Я пытаюсь понять, как это было реализовано. Я знаю, что это детали реализации и могут быть изменены до окончательной окончательной версии, но мне все равно пришлось ломать голову над этой функцией.
Чтобы попытаться понять базовый код, сгенерированный компилятором, я создал этот пример кода:
Код: Выделить всё
private async void button1_Click(object sender, EventArgs e)
{
try
{
}
finally
{
await MyFinallyTest();
}
}
private async Task MyFinallyTest()
{
await Task.Delay(1000);
}
Код: Выделить всё
[CompilerGenerated]
private sealed class d__1 : IAsyncStateMachine
{
public int 1__state;
public Form1 4__this;
public object 7__wrap1;
public int 7__wrap2;
public AsyncVoidMethodBuilder t__builder;
public TaskAwaiter u__$awaiter0;
private void MoveNext()
{
int num = this.1__state;
try
{
TaskAwaiter awaiter;
switch (num)
{
case 1:
break;
default:
{
this.7__wrap1 = null;
this.7__wrap2 = 0;
try
{
}
catch (object obj2)
{
this.7__wrap1 = obj2;
}
awaiter = this.4__this.MyFinallyTest().GetAwaiter();
if (awaiter.IsCompleted)
{
goto Label_0096;
}
this.1__state = num = 1;
this.u__$awaiter0 = awaiter;
Form1.d__1 stateMachine = this;
this.t__builder.AwaitUnsafeOnCompleted(ref awaiter, ref stateMachine);
return;
}
}
awaiter = this.u__$awaiter0;
this.u__$awaiter0 = new TaskAwaiter();
this.1__state = num = -1;
Label_0096:
awaiter.GetResult();
awaiter = new TaskAwaiter();
object obj3 = this.7__wrap1;
if (obj3 != null)
{
Exception source = obj3 as Exception;
if (source
Подробнее здесь: [url]https://stackoverflow.com/questions/24867683/await-in-try-finally-block[/url]