2012-04-12 15 views
14

sagen, dass ich ein Asynchron-Methode haben, die Datei speichert:Wie synchronisiert man Aufgaben?

async Task SaveToFileAsync() 
{ 
    var file = await folder.GetFileAsync (...) 
    var stream = file.OpenFileAsync(...) 
    ///etc 

} 

Nun stell dir vor, dass SaveToFileAsync zweimal gleichzeitig aufgerufen wird. Dies ist ein Problem, weil Sie nicht auf der gleichen Datei

gleichzeitig schreiben können, wenn dies eine reguläre Methode waren, lock() würde dieses Problem beheben:

void SaveToFile() 
{ 
    lock(something) 
    { 
     /// code here 
    } 
} 

jedoch Sperre wird in einem Asynchron-Methode nicht erlaubt .

Natürlich könnte man Monitor.Enter() aufrufen oder einen Mutex verwenden, aber diese Objekte funktionieren mit Threads, nicht mit Aufgaben. Daher sind sie nicht die Antwort.

Also, da lock() keine Option ist, wie können mehrere Aufgaben synchronisiert werden? Insbesondere welchen Code sollte ich schreiben, um sicherzustellen, dass "SaveToFileAsync" nur einmal aufgerufen wird?

+0

Ist das nicht * "SaveToFileAsync" genannt wird, Sie haben einmal gesagt, dass Sie die Methode für genau das Gegenteil von dem verwenden möchten, für das sie entworfen wurde? – Khan

+0

@Jeff die einzige Sache, die in den Sinn kommt, dass Sie in 2 verschiedenen Dateien asynchron speichern möchten, aber den Zugriff auf die gleiche Datei synchronisieren möchten ... – Servy

+2

Sie könnten eine Warteschlange verwenden, die ein separater Worker-Prozess arbeitet. –

Antwort

24

Für einen Asynchron gegenseitigen Ausschlussmechanismus, einen Blick auf

haben

    Building Async Coordination Primitives, Part 6: AsyncLock

Sie verwenden könnte die AsyncLock Klasse folgt: nur

private readonly AsyncLock m_lock = new AsyncLock(); 

async Task SaveToFileAsync() 
{ 
    using (await m_lock.LockAsync()) 
    { 
     var file = await folder.GetFileAsync(...); 
     var stream = await file.OpenFileAsync(...); 
     // etc 
    } 
} 
+2

Warum ist AsyncLock (und andere Synchronisationsmuster) kein integraler Bestandteil der TPL? –

+0

Der 'Part 6' Beitrag gibt keinen Copy/Paste Code. Ein anderer Blogger hat es hier zusammengefasst: http://sanjeev.dwivedi.net/?p=292 –

Verwandte Themen