每秒获取运行函数名称

时间:2018-02-28 07:47:34

标签: c# events

我希望每秒都能获得正在运行的功能名称。我试过这段代码:

public static void DisplayTimeEvent(object source, ElapsedEventArgs e)
{
    // code here will run every second

    //Output is DisplayTimeEvent but I want it to print Main
    Console.WriteLine(GetCurrentMethod());
}

[MethodImpl(MethodImplOptions.NoInlining)]
public static string GetCurrentMethod()
{
    StackTrace st = new StackTrace();
    StackFrame sf = st.GetFrame(1);

    return sf.GetMethod().Name;
}

//main function
Timer myTimer = new Timer();
myTimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent);
myTimer.Interval = 1000;
myTimer.Start();
Console.ReadLine();

上面的代码打印DisplayTimeEvent。如何使其打印Main(或当时正在执行的任何函数主线程)?

2 个答案:

答案 0 :(得分:0)

您的线程打印DisplayTimeEvent因为Timer.Elapsed事件附加到该回调,而在您的回调中,您只检查当前线程的堆栈跟踪。

如果您想在流程中调查其他线程(包括" 主线程"),可以尝试使用System.Diagnostics命名空间,如{{3 }}

答案 1 :(得分:0)

是的,应该是这样......给你方法的来电者姓名。不要以为你可以像你想象的那样得到当前的执行方法。如果方法调用是异步操作或线程完全操作,该怎么办?

仅供参考,从.NET 4.5开始,还有一个选项是使用CallerMemberNameAttribute

public static void DisplayTimeEvent(object source, ElapsedEventArgs e)
{
    Console.WriteLine("Test....");
    GetCurrentMethod();
}

public static string GetCurrentMethod([System.Runtime.CompilerServices.CallerMemberName] string memberName = "")
{
   System.Diagnostics.Trace.WriteLine("member name: " + memberName);
}