2

假设以下代码

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 调用模式)。

4

3 回答 3

2

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

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

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

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

于 2013-02-04T14:30:17.750 回答
1

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

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

于 2013-02-04T14:31:44.320 回答
0

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

于 2013-02-04T14:39:09.870 回答