2012-04-12 16 views
14

Decir que tengo un método asíncrono lo que ahorra a presentar:¿Cómo sincronizar tareas?

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

} 

Ahora imaginemos que SaveToFileAsync se llama dos veces al mismo tiempo. Esto es un problema porque no se puede escribir en el mismo archivo al mismo tiempo

Si esto fuera un método regular, bloqueo() podría solucionar este problema:

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

Sin embargo, la cerradura no está permitido en un método asíncrono .

Por supuesto, se podría llamar a Monitor.Enter() o usar un mutex, pero estos objetos funcionan con hilos, no con tareas. Por lo tanto, no son la respuesta.

Entonces, como lock() no es una opción, ¿cómo se pueden sincronizar varias tareas? En particular, ¿qué código debo escribir para asegurarme de que "SaveToFileAsync" se invoque solo una vez a la vez?

+0

No es * "SaveToFileAsync" se llama solamente una vez a la vez * indicando que le gustaría usar el método exactamente para lo contrario para lo que fue diseñado? – Khan

+0

@Jeff lo único que se le viene a la mente es que desea guardar en 2 archivos diferentes de forma asíncrona pero desea sincronizar el acceso al mismo archivo ... – Servy

+2

Puede usar una cola en la que opere un proceso de trabajo independiente. –

Respuesta

24

Para un mecanismo de exclusión mutua asíncrono, echar un vistazo a

    Building Async Coordination Primitives, Part 6: AsyncLock

Se podría utilizar la clase AsyncLock siguiente manera:

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

¿Por qué AsyncLock (y otros patrones de sincronización) no son parte integral del TPL? –

+0

La publicación 'Part 6' no da el código de copiar/pegar. Otro blogger lo agregó aquí aunque: http://sanjeev.dwivedi.net/?p=292 –

Cuestiones relacionadas