2013-06-08 15 views
5

Mam metodę, która jest często wywoływana z wielu wątków. Obejmuje zapis na dysku przy użyciu await FileIO.WriteTextAsync. Działa to dobrze, gdy jest wywołany z jednym wątku, ale gdy zacznę robić to w wielu wątków, otrzymuję ten błąd:Aplikacja Metro FileIO.WriteTextAsync Wiele wątków

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

wiem, co oznacza, że ​​błąd, ale nie jestem pewien jak to działa dookoła tego. Zazwyczaj utworzę instrukcję lock(object), aby upewnić się, że dostęp do pliku ma tylko jeden wątek na raz. Jednak jest to metoda asynchroniczna i jako taka nie mogę użyć operatora await w treści instrukcji lock(object).

Proszę doradzić, jak sobie z tym poradzić.

Odpowiedz

6

Można użyć SemaphoreSlim działać jako async -Kompatybilny Lock:

SemaphoreSlim _mutex = new SemaphoreSlim(1); 

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

Osobiście nie podoba mi się finally, więc zazwyczaj napisać własny IDisposable aby zwolnić mutex gdy usuwane, a moja kod może wyglądać tak:

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

Cóż Stephen, to nic dziwnego, dlaczego masz tak dużą reputację. Rozwiązanie i twój osobisty dotyk były fantastyczne. Mój proces przebiega teraz idealnie. Użyłem również twojej sugestii, aby wzmocnić moją klasę logowania, która cierpiała na podobny problem. Dziękuję za to! – c0D3l0g1c

+0

Nie ma za co! –

Powiązane problemy