2010-10-24 40 views
18

Statik bir yöntem kullanarak bir ayarlar xml dosyasına yazan çok iş parçacıklı bir uygulama var. Dosyanın aynı anda iki kez güncellenmesinden (erişim/yazma istisnasına neden olmaktan) kaçınmak istiyorum.Statik bir yöntemde Lock()

Bunu nasıl yaparım?

Bu işe yaramazsa: Ayrı bir statik kilit nesnesi oluşturmak ve bu kullanmalıdır

namespace Program 
{ 
    public class Settings 
    { 
     private static void SetSettingsValue (string settings, string value) 
     { 
      // make this thread safe to avoid writing to a locked settings xml file 
      lock (typeof(Settings)) 
      { 
       //write data to xml file 
      } 
     } 
    } 
} 
+1

XML dosyanızın doğru şekilde atılıyor mu (ör. 'Using' aracılığıyla)? Daha fazla kod paylaşabilir misin? Ayrıca, statik yöntemler için, bir tür değil, özel statik nesnelere kilitlemelisiniz. Bkz. Http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx –

cevap

33

Lock() kavramı, erişimin sağlanıp sağlanmadığını kontrol etmek için kullanabileceği ve kullanabileceği mevcut bir nesneyi kullanmaktır.

static object SpinLock = new object(); 

lock(SpinLock) 
{ 
    //Statements 
} 

yürütme kilidi() referans blok yaprak

salınır ve diğer iplikleri (tabii ki, bir seferde bir tane) devam bir kod bloğu çalıştırmak için bekliyor.

+2

Kilit() deyiminin kendisi içinde SpinLock referansını değiştiremeyeceğinizi unutmayın. Kilitleme için kullanılan nesnenin, kodu yürütmesi gereken tüm iş parçacıkları tarafından erişilebilir olması gerekir ve her seferinde referansı değiştiremez veya iş parçacıkları birbirini asla engellemez ve kaynak çekişme/çakışmalar elde edersiniz. –

37

. STRING KULLANMAYIN! Dizeler otomatik olarak içe aktarılır ve programatik olarak bildirilen her dizenin yalnızca bir örneği olur, böylece kilitle özel erişimi garanti edemezsiniz.

Bunu yapmalısınız:

public class A { 
    private static Object LOCK = new Object(); 

    private static void foo() { 
     lock(LOCK) { 
      // Do whatever 
     } 
    } 
} 

;

kilit anahtar kelime (sözdizimi yanlış olabilir Çoğunlukla bir Java insanım ama kilitleme ve dize C# için geçerli staj konusunda aynı kurallar) Karşılıklı bir hariç tutma kilidi zorlar: tek bir iş parçacığı belirli bir nesneyi bir kerede kilitleyebilir. Eğer ikinci bir iplik foo numarasını ararsa, ilk iplik kilit bloğundan çıkana kadar bloke olacaktır.

Evden eve iletileri alma: özel bir statik değişkende statik yöntem kilitleme. Bu nesneyi kimsenin kullanmadığını garanti edemeyeceğiniz için Dizeleri veya typeof (...) işlevlerini kilitlemeyin. Özel olarak ve yeni yaparak herkese dokunulmadığını bildiğiniz bir nesneyi daima kilitleyin.

+3

Bu, tüm tartışmanın en iyi cevabıdır. Çünkü Cameron, kilidin sınıfa özel olduğunu belirtecek kadar bilge oldu. –

+0

Ayrıca, finalin C# eşdeğeri de olmalı, ama C# adamı değilim, o yüzden ne olduğundan emin değilim. C# C++ - style 'const' varsa, o zaman ben Java'dan geçiş yapacağımı düşünüyorum :) –

+0

Tahmin et: http://stackoverflow.com/questions/55984/what-is-the-difference-between-const-and- readonly –

İlgili konular