2012-09-20 88 views
4

我想要一個類(由第三方編寫和維護)的能力,用一些魔術C#糖包裝它,讓我用自定義鎖定機制(或記錄機制或其他)來包裝每個成員函數(或多個)。如何將線程不安全的類包裝爲線程安全且不包裝每個成員函數的

例如,

class Foo { // someone else wrote this and I can't touch it. 
    void A() {} 
    void B() {} 
    // plus 10,000 other functions I don't want to know about 
} 

class WrappedFoo : Foo { // this is my class, I can do what ever I want 
     // this is pseudo code !! 
    OnMemberInvoke(stuff) { 
     lock { 
      Console.WriteLine("I'm calling " + stuff); 
      MemberInvoke(stuff); 
      Console.Writeline("I'm done calling " + stuff); 
     } 
    } 
    // I could also deal with OnMemberInvokeStart() and OnMemberInvokeDone() 
    // pairwise hooks too. 
} 

WrappedFoo wfoo = new WrappedFoo(); 
wfoo.A(); 
wfoo.B(); 

輸出

I'm calling A 
I'm done calling A 
I'm calling B 
I'm done calling B 

現在,我想我可以DynamicObjectsTryInvokeMember做到這一點,但後來我失去了所有的類型檢查和標籤完成我愛C# 。在這個例子中,我提到了lock的線程安全性,但我正在尋找一個這樣做的一般方法。此代碼旨在用於真實世界的硬件測試,需要額外的重試,日誌記錄等。

+0

只是包裝的每個功能到一個鎖是很少足夠寫線程代碼,所以IMO你的整個方法可能有缺陷。通常,您需要從頭開始設計API,並考慮到線程安全性(請參閱隊列'和ConcurrentQueue '之間的區別,或者您需要在調用代碼中手動鎖定,通常將一些方法調用鏈接到單鎖。 – CodesInChaos

+0

你所有的方法都有相同的簽名? – prashanth

回答

相關問題