Ожидайте в блоке try-finallyC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Ожидайте в блоке try-finally

Сообщение Anonymous »

Я экспериментировал с Visual Studio 14 CTP 2. Эта версия C# vNext позволяет использовать ключевое слово await внутри блокаfinally.

Я пытаюсь понять, как это было реализовано. Я знаю, что это детали реализации и могут быть изменены до окончательной окончательной версии, но мне все равно пришлось ломать голову над этой функцией.

Чтобы попытаться понять базовый код, сгенерированный компилятором, я создал этот пример кода:

Код: Выделить всё

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]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • WPF: В чем разница между try...finally и try..catch..finally в WPF, MVVM? [закрыто]
    Гость » » в форуме C#
    0 Ответы
    43 Просмотры
    Последнее сообщение Гость
  • WPF: В чем разница между try...finally и try..catch..finally в WPF, MVVM? [закрыто]
    Anonymous » » в форуме C#
    0 Ответы
    42 Просмотры
    Последнее сообщение Anonymous
  • Какова цель пустого блока try в конструкции try-finally?
    Anonymous » » в форуме C#
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • Наконец, всегда запускается непосредственно перед возвратом в блоке try, тогда почему обновление в блоке, наконец, не вл
    Anonymous » » в форуме Python
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous
  • Почему возврат в `finally` переопределяет `try`?
    Гость » » в форуме Javascript
    0 Ответы
    33 Просмотры
    Последнее сообщение Гость

Вернуться в «C#»