2017-10-25 1 views
-2

Wenn i einen Standard-Async implementieren/erwartet Verfahren wie:Async & Await IL-Code

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

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

Der erzeugte IL-Code- und die Async-Zustand-Maschine ein Feld enthält, „das“ mit einem Hinweis auf die Instanz, die das Verfahren aufgerufen . Wenn der Code an einen statischen angepasst wird, gibt es natürlich keinen "diesen" Wert.

Um dies nicht über Reflektion zu tun, mehr aus Sicht der CLR oder des Debuggers. Weiß jemand, wie ich innerhalb der "statischen Testmethode" feststellen kann, von welcher Methode ich genannt wurde - auf der IL-Ebene!

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

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

Sie warten nicht auf Ihren Warter. –

+3

Sie sollten sich nicht auf private Implementierungsdetails eines Features verlassen. Wenn eine bestimmte Methode Zugriff auf eine bestimmte Instanz benötigt, sollten Sie diese Instanz explizit verfügbar machen, damit Sie zuverlässig darauf zugreifen können, anstatt zu versuchen, private Implementierungsdetails zu finden, die die gewünschten Informationen enthalten können. – Servy

+0

Ich bin nicht darauf angewiesen, wollte nur wissen, wie die CLR es auf die Wurzel eines Wartens ... – user3547817

Antwort

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 
     } 
    } 
} 
3

, wie ich in der "statischen Testmethod" bestimmen kann, aus dem Verfahren i

genannt wurde, kann Sie CallerMemberName Attribut

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

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

PS: Sie können Verwenden Sie auch CallerFilePath oder CallerLineNumber