How can I create an asynchronous method using reflection?
Basically I need something like this:
async public Task asyncmethod()
{
await something();
}
but I need to do it with reflection.
The translation of async
methods works at the level of the C# (or VB.NET) compiler, there is no support for it in CIL. What the compiler does in the simplest case is that it translates code like this:
async public Task asyncmethod()
{
// some code
var x = await something();
// more code
}
into code that is basically equivalent to something like:
public Task asyncmethod()
{
// some code
return something().ContinueWith(
t =>
{
var x = t.Result;
// more code
});
}
The real code is much more complicated that that (it uses SynchronizationContext
, it's not actually asynchronous if something()
returns already finished Task
, it supports await
ing things other thank Task
s) and it would be even more complicated for more complicated C# code.
But if you really want to create async
methods using Reflection.Emit, this transformation is what you actually have to do manually.
But one thing to note is that if your method uses await
only once right before it return
s, you can rewrite it into (assuming something()
returns a Task
and not something else that is await
able):
public Task asyncmethod()
{
// some code
return something();
}