Async& Await IL Code

时间:2017-10-25 20:02:23

标签: c# async-await

如果我实现了默认的async / await方法,如:

class Program
{
    static void Main(string[] args)
    {
        new Program().TestMethod();
    }

    private async void TestMethod()
    {
        await Task.Delay(10);
    }
}

生成的IL-Code和异步状态机包含一个字段" this"引用调用该方法的实例。如果代码被调整为静态代码,那么当然没有"这个"值。

不要通过反射来做到这一点,更多的是从CLR或调试器的角度来看。 有谁知道我如何在"静态TestMethod"从哪个方法调用 - 在IL级别上!

class Program
{
    static void Main(string[] args)
    {
        TestMethod();
    }

    private static async void TestMethod()
    {
        await Task.Delay(10);
    }
}

2 个答案:

答案 0 :(得分:3)

  

我如何确定"静态TestMethod"从哪个方法叫做

您可以使用CallerMemberName属性

static void Main(string[] args)
{
    new Program().TestMethod();
    Console.ReadLine();
}

private async void TestMethod([CallerMemberName]string caller = "")
{
    Console.WriteLine(caller);
}

PS:您还可以使用CallerFilePathCallerLineNumber

答案 1 :(得分:0)

using System;
using System.Diagnostics;

namespace Cli
{
    class Program
    {
        static void Main(string[] args)
        {
            new Program().TestMethod();
        }

        private void TestMethod()
        {
            var sf = new StackFrame(1); //get caller stackframe
            var mi = sf.GetMethod(); //get method info of caller
            Console.WriteLine("{0}::{1}", mi.DeclaringType, mi.Name);
            // Cli.Program::Main
        }
    }
}