2013-06-08 19 views
5

Ho un metodo che viene chiamato frequentemente da più thread. Implica la scrittura su disco utilizzando await FileIO.WriteTextAsync. Questo funziona bene quando viene chiamato da un unico filo, ma una volta che mi metto a fare questo in più thread, ottengo questo errore:Metro App FileIO.WriteTextAsync Multiple Threads

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

So cosa significa l'errore, ma non sono sicuro di come lavorare intorno ad esso. Normalmente, vorrei creare una dichiarazione lock(object), per garantire che il file sia accessibile solo da un thread alla volta. Tuttavia, questo è un metodo asincrono e in quanto tale non è possibile utilizzare l'operatore await nel corpo dell'istruzione lock(object).

Si prega di avvisare su come gestire questo scenario.

risposta

6

È possibile utilizzare SemaphoreSlim di agire come un blocco async compatibile:

SemaphoreSlim _mutex = new SemaphoreSlim(1); 

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

Personalmente, non mi piace il finally, così io di solito scrivo il mio IDisposable di rilasciare il mutex al momento della dismissione, e il mio codice può assomigliare a questo:

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

Bene Stephen non c'è da meravigliarsi perché si ha una reputazione così massiccia. La soluzione e il tuo tocco personale sono stati fantastici. Il mio processo funziona perfettamente ora. Ho anche usato il tuo suggerimento per rinforzare la mia classe di disboscamento che soffriva di un problema simile. Grazie per quello! – c0D3l0g1c

+0

Prego! –