2012-04-12 19 views
14

Dire che ho un metodo asincrono che salva in un file:Come sincronizzare le attività?

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

} 

Ora immaginate che SaveToFileAsync viene chiamato due volte contemporaneamente. Questo è un problema perché non si può scrivere sullo stesso file contemporaneamente

Se questo fosse un metodo regolare, lock() sarebbe risolvere questo problema:

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

Tuttavia, serratura non è consentito in un metodo asincrono .

Ovviamente, si può chiamare Monitor.Enter() o utilizzare un mutex ma questi oggetti funzionano con i thread, non con le attività. Quindi non sono la risposta.

Quindi, poiché lock() non è un'opzione, come è possibile sincronizzare più attività? In particolare, quale codice dovrei scrivere per assicurare che "SaveToFileAsync" venga chiamato solo una volta alla volta?

+0

non è * "SaveToFileAsync" si chiama solo una volta alla volta * affermando che ti piacerebbe utilizzare il metodo esattamente per l'opposto di quello per cui è stato progettato? – Khan

+0

@Jeff l'unica cosa che viene in mente è che si desidera salvare in 2 file diversi in modo asincrono ma si desidera sincronizzare l'accesso allo stesso file ... – Servy

+2

È possibile utilizzare una coda su cui opera un processo di lavoro separato. –

risposta

24

Per un meccanismo di mutua esclusione asincrono, uno sguardo ai

    Building Async Coordination Primitives, Part 6: AsyncLock

È possibile utilizzare il AsyncLock classe segue:

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

Perché AsyncLock (e altri pattern di sincronizzazione) non sono parte integrante del TPL? –

+0

Il post 'Parte 6' non fornisce il codice copia/incolla. Un altro blogger l'ha aggregato qui: http://sanjeev.dwivedi.net/?p=292 –

Problemi correlati