c# - 如何仅在使用 TPL 时从自己的方法获取堆栈跟踪?

标签 c# task-parallel-library

我想获取所谓我的函数的方法的名称,这似乎是 Tpl 的一个问题

有什么好的解决办法吗?

顺便说一句:我知道 CallerMemberName ,但我想要一个不同的解决方案,这样就不会弄乱我的代码

这是我的测试代码,因此可以在下一版本的 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

Start

F1

Main

...

最佳答案

您可以过滤掉所有不属于您的程序集,例如通过检查程序集不在 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

Main

关于c# - 如何仅在使用 TPL 时从自己的方法获取堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40971869/

相关文章:

c# - '等待'一个可观察的

c# - async void 方法的用例,重新审视

c# - 当单个对象属性是字符串时,如何防止将其转换为 DateTime

c# - 在 asp.net 中获取 BIOS 日期

c# - Task.WaitAll 卡住应用程序 C#

c# - 如何将 foreach 转换为 Parallel.ForEach?

c# - 数据流(任务并行库)和异步等待

c# - 对下拉列表进行排序

c# - 使用默认参数的 DLLImport c++ 函数

c# - 列表和字符串转换