2013-02-04 27 views
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(); 

爲什麼

我不希望有寫調用掛鉤到軟件的膽量,這是一個觀察到問題(HMM的想法來了...)(其實際上觀察用於自動化類型功能的UI調用模式)。

+0

您已經有一個信號設置。你還需要什麼? –

+0

好問題。我想鉤入更多的方法,所以我最終會有很多AutoResetEvents。另外,有一個系統觀察已經發生的事情,而不是每次發生什麼事情都會發生。也因爲我想知道這是否可能:) – Tom

+1

您可能可以使用[來電者信息屬性](http://bartwullems.blogspot.ca/2012/02/c-5-caller-info- attributes.html),儘管你可能需要重新設計代碼。您也可以使用StackTrace類並抓取它的框架,雖然這在性能方面代價很高(我認爲),並且您需要小心編譯器優化,這可能會使您的方法代碼內聯。 –

回答

2

據我所知,CLR不支持這種情況。

如果是這樣,這會導致各種各樣的併發症。例如,注意,編譯器可能直列您的私有方法,所以實際的代碼可能看起來更像是這樣的:

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

在這種情況下SomeRunTimeThing.LastMethodExecuted.Name永遠沒有價值Method2。 (這也是爲什麼你不應該使用堆棧跟蹤信息除了日誌和調試之外的任何東西。)

+0

非常棒的一點,內聯不是我想到的。也許唯一的辦法就是個人信號。 – Tom

1

如果我明白了:有必要確定最後調用的方法,而不改變方法代碼。想到一個解決方案:在社會中爲所有類使用攔截。在攔截代碼存儲中調用了什麼方法。

UPD 例如,你可以使用統一,請參閱:http://msdn.microsoft.com/en-us/library/ff660861%28v=pandp.20%29.aspx

+0

是的,我認爲這可能是這種情況,歸因於每種方法是唯一的答案。它也可以通過方法名稱在字典中引用,所以你可以調用dict [「Method2」]。WaitOne()。UPD:非常感謝,我現在要讀一讀:) – Tom

+0

實際上在某些情況下你不需要屬性。你只需要從容器中解析你的類實例,以便攔截一些方法。 – gabba

相關問題