Skip to content

Instantly share code, notes, and snippets.

@dgrunwald
Created April 15, 2012 09:12
Show Gist options
  • Save dgrunwald/2391396 to your computer and use it in GitHub Desktop.
Save dgrunwald/2391396 to your computer and use it in GitHub Desktop.
async decompiler
// Original:
public async Task<bool> SimpleBoolTaskMethod()
{
Console.WriteLine("Before");
await Task.Delay(TimeSpan.FromSeconds(1.0));
Console.WriteLine("After");
return true;
}
// MoveNext
void IAsyncStateMachine.MoveNext()
{
bool result;
try
{
int num = this.<>1__state;
TaskAwaiter taskAwaiter;
if (num != 0)
{
Console.WriteLine("Before");
taskAwaiter = Task.Delay(TimeSpan.FromSeconds(1.0)).GetAwaiter();
if (!taskAwaiter.IsCompleted)
{
this.<>1__state = 0;
this.<>u__$awaiterb = taskAwaiter;
this.<>t__builder.AwaitUnsafeOnCompleted<TaskAwaiter, Async.<SimpleBoolTaskMethod>d__a>(ref taskAwaiter, ref this);
return;
}
}
else
{
taskAwaiter = this.<>u__$awaiterb;
this.<>u__$awaiterb = default(TaskAwaiter);
this.<>1__state = -1;
}
taskAwaiter.GetResult();
taskAwaiter = default(TaskAwaiter);
Console.WriteLine("After");
result = true;
}
catch (Exception exception)
{
this.<>1__state = -2;
this.<>t__builder.SetException(exception);
return;
}
this.<>1__state = -2;
this.<>t__builder.SetResult(result);
}
// After first async decompilation phase:
[DebuggerStepThrough]
public async Task<bool> SimpleBoolTaskMethod()
{
Console.WriteLine("Before");
TaskAwaiter taskAwaiter = Task.Delay(TimeSpan.FromSeconds(1.0)).GetAwaiter();
if (!taskAwaiter.IsCompleted)
{
await ref taskAwaiter;
taskAwaiter = this.<>u__$awaiterb;
this.<>u__$awaiterb = default(TaskAwaiter);
this.<>1__state = -1;
}
taskAwaiter.GetResult();
taskAwaiter = default(TaskAwaiter);
Console.WriteLine("After");
return 1;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment