我想要一個類(由第三方編寫和維護)的能力,用一些魔術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
現在,我想我可以DynamicObjects
和TryInvokeMember
做到這一點,但後來我失去了所有的類型檢查和標籤完成我愛C# 。在這個例子中,我提到了lock
的線程安全性,但我正在尋找一個這樣做的一般方法。此代碼旨在用於真實世界的硬件測試,需要額外的重試,日誌記錄等。
只是包裝的每個功能到一個鎖是很少足夠寫線程代碼,所以IMO你的整個方法可能有缺陷。通常,您需要從頭開始設計API,並考慮到線程安全性(請參閱隊列'和ConcurrentQueue '之間的區別,或者您需要在調用代碼中手動鎖定,通常將一些方法調用鏈接到單鎖。 –
CodesInChaos
你所有的方法都有相同的簽名? – prashanth