SORU
21 AĞUSTOS 2014, PERŞEMBE


Neden't Dışlama atıldığında serbest değil mi?

Aşağıdaki kodu var:

using (Mutex mut = new Mutex(false, MUTEX_NAME))
{
    if (mut.WaitOne(new TimeSpan(0, 0, 30)))
    {
       // Some code that deals with a specific TCP port
       // Don't want this to run at the same time in another process
    }
}

if blok içinde bir kesme noktası ayarlamak ettik, ve Visual Studio başka bir örneği içinde aynı kodu koştu. Beklendiği gibi, .WaitOne çağrı blok. Ancak, benim için sürpriz oldu, en kısa sürededevamve using Blok sona erer ilk örneği, terk edilmiş bir Dışlama ilgili ikinci süreçte bir istisna olsun.

Düzeltme ReleaseMutex aramak için:

using (Mutex mut = new Mutex(false, MUTEX_NAME))
{
    if (mut.WaitOne(new TimeSpan(0, 0, 30)))
    {
       // Some code that deals with a specific TCP port
       // Don't want this to run twice in multiple processes
    }

    mut.ReleaseMutex();
}

Şimdi, her şey beklendiği gibi çalışıyor.

Sorum Şu:IDisposable genellikle noktasıdırtemizlerne olursa olsun devlet sana bir şeyler koymak. Belki de birden fazla olması görebiliyordumbeklerveserbest bırakırbu zaman uyumu için kolu aktiften using bir blok, ama içinde, otomatik olarak serbest bırakılması gerekmez mi? Diğer bir deyişle, neden using blok olsam ReleaseMutex aramam gerekiyor mu?

Ayrıca şimdi Eğer if blok içindeki kod çöküyor, birbirini kapsamayan nesneler ortalıkta terk ederim diye endişeleniyorum.

using blok Mutex koymak için herhangi bir yararı var mı? Ya da, sadece gerekiryenibir deneyin Mutex örneği, bir paket yakalamak, ve içinde ReleaseMutex() arama/nihayetblok (aslında ben . ne tam olarak uygulanması ^em>düşündümDispose() yapardı)

CEVAP
21 AĞUSTOS 2014, PERŞEMBE


The documentation açıklar arasında kavramsal bir fark olduğunu "" bölümü) Açıklamalar. ( ^strong>başlatmasınızaman uyumu bir nesne (ki yapardeğilaslında, özel bir şey eşitleme gelince yapınsahibi olmabir Dışlama (WaitOne kullanarak). Not:

  • WaitOne bir boolean, bir Dışlama edinme anlam verirbaşarısız(timeout) ve her iki durumda da ele alınması gerekir
  • WaitOne true, arama iş parçacığı Dışlama satın aldı ve geri döndüğündegerekirReleaseMutex veya başka zaman uyumu terk edilmiş olacak diyorlar
  • false, sonra iş parçasıyla dönerolmamalıdırReleaseMutex Ara

Bu yüzden, örnekleme Uyumu daha fazlası var. using neyse kullanıp kullanmayacağını, Dispose ne bir göz (inherited from WaitHandle olarak) alalım:

protected virtual void Dispose(bool explicitDisposing)
{
    if (this.safeWaitHandle != null)
    {
        this.safeWaitHandle.Close();
    }
}

Gördüğünüz gibi, zaman uyumudeğilserbest, ama temizlik için de bir yer yoktur using ile yapıştırma iyi bir yaklaşım olur.

Devam etmek gerekir, elbette try/finally bir blok, eğer zaman uyumu kazanılır, bunu düzgün bir şekilde serbest bırakılırsa, emin olmak için kullanabilirsiniz. Bu muhtemelen en basit yaklaşımdır.

Eğergerçektenönemsemiyor durumda, zaman uyumu başarısız olmak elde olan etmedin belirtilen bu yana geçmek TimeSpan WaitOne), elinden sarma Mutex kendi sınıf uygulayan IDisposable, kazanmak, zaman uyumu içinde yapıcı (kullanarak WaitOne() ile bağımsız değişken) ve yayın içine Dispose. Ancak, muhtemelen ben de tavsiye etmiyorum bu, bu olmasına neden olacak konuları için sonsuza kadar beklemek eğer bir şeyler ters giderse, ve ne olursa olsun orada good reasons açıkça işleme her iki durumda çalışırken bir elde bahsedildiği gibi tarafından @HansPassant.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FUzzyBUnnyBOoties

    FUzzyBUnnyBO

    3 EKİM 2007
  • HouseholdHacker

    HouseholdHac

    6 Kasım 2007
  • RyanXLT

    RyanXLT

    22 Ocak 2011