2017-10-25 4 views
-2

은/방법처럼 기다리고 :비동기 & 기다리고 있습니다 IL 코드

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

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

생성 된 IL-코드와 비동기 상태 머신이 필드를 포함하는 "이"메소드를 호출 인스턴스에 대한 참조 . 코드가 정적 코드로 조정 된 경우 물론 "this"값은 없습니다.

CLR 또는 디버거의 관점에서 볼 때 반사를 통해이 작업을 수행하지 마십시오. 누구나 내가 "정적 TestMethod"내에서 확인할 수있는 방법을 알고있다 - IL 수준에서 호출되었습니다!

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

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

대기중인 대기자가 아닙니다. –

+3

기능의 개인 구현 세부 정보에 의존해서는 안됩니다. 특정 메소드가 특정 인스턴스에 액세스해야하는 경우, 사용자가 원하는 정보가 있거나 없을 수도있는 개인 구현 세부 사항을 찾기보다는 해당 인스턴스에 안전하게 액세스 할 수 있도록 인스턴스를 명시 적으로 노출해야합니다. – Servy

+0

나는 그것에 의존하지 않고, 단지 CLR이 그것을 기다리고있는 루트까지 추적하는 방법을 알고 싶었다. – user3547817

답변

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

내가

를 호출 한 방법에서 "정적 TestMethod"에서 확인하는 방법을 당신은 CallerMemberName 속성

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

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

PS를 사용할 수 있습니다 : 당신이 할 수있는 CallerFilePath 또는 CallerLineNumber

을 사용하십시오.