确定当前正在执行的方法

时间:2013-02-04 14:15:58

标签: c# events clr autoresetevent

假设以下代码

private AutoResetEvent m_MethodDone = new AutoResetEvent(false);

private void Method1()
{
    // Do something
    Method2();
}

private void Method2()
{
    // All done
    m_MethodDone.Set();
}

private void Method3()
{
}

private void Program()
{
    Task t = New Task(() => { // Code In Question
        m_MethodDone.WaitOne()
        Method3();
    });

    t.Start();
    // Do other things.
}

问题

有没有办法“捕获”CLR事件,无论是来自我的线程中的事件还是循环?

if(SomeRunTimeThing.LastMethodExecuted.Name == "Method2")
     Method3();

为什么

我不想将调用挂钩编写到软件的内容中,这是一个可观察的问题(嗯想法即将到来......)(它实际上观察了UI调用模式用于自动化类型功能)。

3 个答案:

答案 0 :(得分:2)

据我所知,CLR不支持这种情况。

如果是的话,这会导致各种各样的并发症。例如,请注意编译器可能内联您的私有方法,因此实际代码可能看起来更像这样:

private void Method1()
{
    // Body of Method 1
    // Body of Method 2
}

在这种情况下,SomeRunTimeThing.LastMethodExecuted.Name永远不会取值Method2。 (这也是为什么除了记录和调试之外不应该使用堆栈跟踪信息的原因。)

答案 1 :(得分:1)

如果我理解:有必要在不改变方法代码的情况下确定最后调用的方法。 我想到了一个解决方案:对socope中的所有类使用拦截。并且在拦截代码中存储了调用的方法。

<强> UPD 例如,您可以使用unity,请参阅:http://msdn.microsoft.com/en-us/library/ff660861%28v=pandp.20%29.aspx

答案 2 :(得分:0)

没有简单的方法来跟踪事后调用的内容,但是可以查看称为特定方法的方法。也许您可以使用调用堆栈来解决您的问题。有关示例,请参阅http://www.csharp-examples.net/reflection-callstack/