2013-06-08 11 views
5

Ich habe eine Methode, die häufig aus mehreren Threads aufgerufen wird. Es beinhaltet Schreiben auf Festplatte mit await FileIO.WriteTextAsync. Dies funktioniert gut, wenn es von einem einzelnen Thread aufgerufen wird, aber sobald ich tue dies in mehreren Threads starten, bekomme ich diesen Fehler:Metro App FileIO.WriteTextAsync Mehrere Threads

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

Ich weiß, was der Fehler bedeutet, aber ich bin mir nicht sicher, wie man arbeitet um es herum. Normalerweise würde ich eine lock(object)-Anweisung erstellen, um sicherzustellen, dass auf die Datei nur von jeweils einem Thread zugegriffen wird. Dies ist jedoch eine asynchrone Methode und als solche kann ich den Operator await nicht im Text der lock(object)-Anweisung verwenden.

Bitte geben Sie an, wie Sie mit diesem Szenario umgehen.

Antwort

6

Sie SemaphoreSlim können als async -kompatible Sperre wirken:

SemaphoreSlim _mutex = new SemaphoreSlim(1); 

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

Ich persönlich mag es nicht, die finally, so dass ich in der Regel meine eigene IDisposable schreiben den Mutex freizugeben, wenn angeordnet sind, und meine Code kann wie folgt aussehen:

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

Nun Stephen ist es kein Wunder, warum Sie so einen massiven Ruf haben. Die Lösung und Ihre persönliche Note waren fantastisch. Mein Prozess läuft jetzt perfekt. Ich habe auch Ihren Vorschlag benutzt, um meine Holzfällerklasse zu verbessern, die an einem ähnlichen Problem litt. Dank dafür! – c0D3l0g1c

+0

Gern geschehen! –