2013-04-03 38 views
0

我覺得我可能會在這裏重新發明輪子。這是我正在嘗試實現的:監視器通知輸入/釋放對象

當使用lockMonitor.Enter鎖定對象時,我希望收到通知。同樣,當對象被釋放時,我想要通知。

我想寫一個包裝類,公開一個observable來發送通知,還有一些獲取/釋放鎖的方法。但是,就像我提到的,我覺得我可能會重做一些已經存在的東西。我可以使用任何.NET技術來實現這一點,而無需編寫一個新的類?

編輯: 回答一些問題: 爲什麼?在嘗試執行之前,我需要知道一段代碼是否忙碌。假設我們在UI上有兩個按鈕,A和B.A執行methodA,B執行methodB。他們都使用相同的對象來鎖定/同步。我想禁用這些按鈕,當我看到有人正在執行一段被同步對象實例_syncObject鎖定的代碼時。我想給用戶一個表示該功能目前無法執行的指示。

Monitor.TryEnter或試圖驗證鎖是否可用不是解決方案,因爲它需要輪詢而不是通知。

void methodA() 
{ 
lock(_syncObject) 
{ 
... 
} 
} 

void methodB() 
{ 
{ 
lock(_syncObject) 
{ 
... 
} 
} 
+0

我不這麼認爲。 –

+1

即使可以,你也可能不想。如果你想這樣做,你有可能會遇到設計方面的問題。 – Servy

+2

你爲什麼要這麼做?這不是肯定的內置。也許如果我們知道「爲什麼」,我們可以更好地回答。 – usr

回答

0

目前尚不清楚你想要做什麼。 如果您想要某些線程正在執行受保護的代碼部分 的某些通知,您可以創建一組事件,因此只要代碼部分啓動,就可以觸發代碼正在執行的事件...結束時相同,就在鎖定被釋放之前。

+0

我在想着類似的東西,現在假設這個鎖對象實例被用在幾個地方,現在我將不得不在這些地方添加這個事件。 – LadderLogic

0

你會得到的唯一的「通知」是Monitor被鎖定或它已被解鎖。例如:

bool lockTaken; 
    Monitor.Enter(lockObject, ref lockTaken); 
    if(!lockTaken) Console.WriteLine("Already locked"); 
    else Console.WriteLine("Not already locked."); 

監視器和其他同步對象用於控制線程,而不是通知。如果你想要發生事件的通知,創建事件並提升它們 - 這就是事件的目的。

+0

我知道事件。謝謝! – LadderLogic