2009-06-16 18 views
5

Kodumda bir kilit var.
Aynı anda iki iş parçacığım var. Bir iş parçacığının bu nesneyi kilitleyip kilitlemediğini nasıl anlarım?Bir Nesne Kilitliyse Nasıl Çıkarım? C#

private readonly object _lockObject = new Object(); 

// Both methods running 
public void Method1() 
{ 
    if(certainCriteria) 
    { 
     lock(_lockObject) 
     { 
     //doWork; 
     } 
    } 
} 

// Both methods running 
public void Method2() 
{ 
    if(isLocked?(_lockObject)) 
    { 
     //doWork; 
    } 
} 

yöntem?

Şimdiden teşekkürler!

cevap

8

Sen olabilir kullanım Monitor.TryEnter (ya 0 zaman aşımı veya hiç bir zaman aşımı almaz aşırı) ve başarılı olursa o zaman hemen Monitor.Exit çağrı - ama bu genelde kötü olduğunu söyleyebilirim tasarım kokusu. Özellikle, veriler hemen geri veriyorlar.

Neyi başarmaya çalışıyorsunuz?

+0

@Jon: Yaow çok hızlı, yaaw ise (bir Siyah ülke aksanı yönetebilirseniz daha iyi okur). Devasa bir uyarı ile önereceğim şey buydu: "Bu," kilit nasıl çalıştığını "bildiğimiz temelde çalışır. – AnthonyWJones

+0

Özellikle kilidin nasıl çalıştığını bilmesine bağlı olduğu için rahatsız değilim - bu değişecek gibi değil. Sadece yanlış yanlış hissettiriyor. Bunun yararlı olduğu bazı * durumlar olduğunu söyleyebilirim, fakat muhtemelen kullanıldığı yerlerden daha azdır! –

+0

Merhaba yine Jon! Bir BufferManager uyguluyorum. Temelde bir yığın tamponlar vardır. Bir iş parçacığı pop() yığını ve boş olduğunda - bir iş parçacığı yığını doldururken tüm iş parçacıklarının bir sonraki pop() üzerinde beklemesini istiyorum. Doldurulduğunda - diğer tüm konular açılır. Yine de C# kilitleme mekanizmalarından emin değilim! – divinci