2011-05-30 18 views
7

我想 - 爲了掩蓋原因,您不應該質疑 - 在方法中啓動鎖定,然後在另一個方法中結束。不知怎的,喜歡:以不同的方法啓動和完成鎖定

object mutex = new object(); 

void Main(string[] args) 
{ 
    lock (mutex) 
    { 
     doThings(); 
    } 
} 

也有同樣的行爲:

object mutex = new object(); 

void Main(string[] args) 
{ 
    Foo(); 
    doThings(); 
    Bar(); 
} 

void Foo() 
{ 
    startLock(mutex); 
} 

void Bar() 
{ 
    endlock(mutex); 
} 

的問題是,鎖定關鍵字塊中的語法同樣適用,當然。我知道鎖並不意味着像這樣使用,但我更願意接受S/O的創造性和冒險解決方案。 :)

+1

「的晦澀的原因你不質疑」 。你希望得到低投票?設置不好的音調。 – Oded 2011-05-30 20:46:30

+5

@Oded:我正在尋找一種幽默的語氣,對不起。我只是想避免關於優秀設計的對話,因爲我知道這不是,並且完全知道這個事實。我寧願看到創造性的解決方案和黑客,這就是爲什麼這個問題被標記爲「黑客」。 – Lazlo 2011-05-30 20:49:02

+0

我對在這裏使用幽默的人很好,但「你不會有問題」只是聽起來像一個推銷員和精英主義者。 – Oded 2011-05-30 20:50:59

回答

16
private readonly object syncRoot = new object(); 

void Main(string[] args) 
{ 
    Foo(); 
    doThings(); 
    Bar(); 
} 

void Foo() 
{ 
    Monitor.Enter(syncRoot); 
} 

void Bar() 
{ 
    Monitor.Exit(syncRoot); 
} 

[編輯]

當您使用lock,這是引擎蓋下是.NET 4發生了什麼:

bool lockTaken = false; 
try 
{ 
    Monitor.Enter(syncRoot, ref lockTaken); 

    // code inside of lock 
} 
finally 
{ 
    if (lockTaken) 
     Monitor.Exit(_myObject); 
}  
+0

好吧,這比預期的要容易得多。 – Lazlo 2011-05-30 20:50:43

+0

從http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx: 「鎖定關鍵字在塊的開始處調用」Enter「,在塊的結尾處調用」Exit「 「。 – trutheality 2011-05-30 20:53:33

+0

'lock'語句只是'Monitor.Enter(x)try {/ * work * /} {Monitor.Exit(x)}'的語法糖。 – 2011-05-30 20:54:18