假设以下代码
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调用模式用于自动化类型功能)。
答案 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/。