2013-06-08 14 views
5

Birden çok ileti dizisinden sıkça aranan bir yöntem var. await FileIO.WriteTextAsync kullanarak diske yazmayı içerir. tek iplikten çağrıldığında bu iyi çalışır, ancak birden çok iş parçacığı yapmaya başlayabilir kez, bu hatayı alıyorum: hata ne anlama geldiğini biliyorum ama nasıl çalıştığını emin değilimMetro Uygulaması FileIO.WriteTextAsync Çoklu Konular

The process cannot access the file because it is being used by another process. 

etrafında. Normalde, dosyaya her seferinde yalnızca bir iş parçacığı tarafından erişildiğinden emin olmak için lock(object) ifadesi oluştururdum. Ancak, bu bir eşzamansız bir yöntemdir ve ben lock(object) deyiminin gövdesinde await işlecini kullanamıyorum.

Lütfen bu senaryoyu nasıl kullanacağınız konusunda öneride bulunun.

cevap

6

Bir async -uyumlu kilidi olarak hareket SemaphoreSlim kullanabilirsiniz: Şahsen

SemaphoreSlim _mutex = new SemaphoreSlim(1); 

async Task MyMethodAsync() 
{ 
    await _mutex.WaitAsync(); 
    try 
    { 
    ... 
    } 
    finally 
    { 
    _mutex.Release(); 
    } 
} 

, ben finally sevmiyorum, bu yüzden genellikle yazmak benim bertaraf zaman uyumu sağlayıcısını bırakma IDisposable kendi ve benim Kod şöyle görünebilir:

async Task MyMethodAsync() 
{ 
    // LockAsync is an extension method returning my custom IDisposable 
    using (await _mutex.LockAsync()) 
    { 
    ... 
    } 
} 
+0

Peki Stephen, neden bu kadar büyük bir şöhrete sahip olduğunuzu merak etmeyin. Çözüm ve kişisel dokunuşunuz harikaydı. Benim süreçim şimdi mükemmel çalışıyor. Aynı zamanda, benzer bir sorundan muzdarip olan günlük sınıfımın önüne geçmek için önerilerinizi kullandım. Bunun için teşekkürler! – c0D3l0g1c

+0

Rica ederim! –