2016-12-05 9 views
2

私はこのように私の関数と呼ばれるメソッドの名前を取得したい、それはTplで少し問題があるようですTPLを使用している場合にのみ、独自のメソッドからスタックトレースを取得する方法は?

良い解決策はありますか?

ところで:CallerMemberNameを知っI、しかし、私は別のソリューションをしたいのでここに私のコード

を乱雑にしません、私のテストコードはとてもTPL

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine(F1().Result); 
     Console.ReadKey(); 
    } 

    static async Task<string> F1() 
    { 
     return await F2(); 
    } 

    static Task<string> F2() 
    { 
     var callingMethods = new StackTrace().GetFrames().Select(v => v.GetMethod().Name); 
     var result = string.Join(Environment.NewLine, callingMethods); 
     return Task.FromResult(result); 
    } 
} 

の次のバージョンで破ることができるですそして、これは

F2

MoveNextメソッドの出力である

スタート

F1

メイン

...

+0

**それはTPLに問題のビットですなぜあなたは**と考えていますか? – Maarten

+0

彼らはそこに別のレイヤーを置くので – Yacov

答えて

4

あなたは、アセンブリをチェックすることにより、例えば、あなたではないすべてのアセンブリを、フィルタリングできGACではありません:

var callingMethods = new StackTrace().GetFrames() 
         .Select(v => v.GetMethod()) 
         .Where(m => !m.DeclaringType.Assembly.GlobalAssemblyCache 
            && !m.DeclaringType.CustomAttributes.Any(ca => ca.AttributeType == typeof(CompilerGeneratedAttribute)) 
           ) 
         .Select(m => m.Name); 

出力:

F2

F1

メイン

関連する問題