Comment synchroniser les tâches?

Dire que j'ai une méthode asynchrone qui enregistre dans un fichier:

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

}

Maintenant, imaginez que SaveToFileAsync est appelé deux fois simultanément. C'est un problème parce que vous ne pouvez pas écrire sur le même fichier en même temps

Si c'est une méthode régulière, lock() permettrait de résoudre ce problème:

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

Cependant, verrouillage n'est pas autorisé dans une méthode asynchrone.

Bien sûr, on pourrait appeler Moniteur.Enter() ou utiliser un mutex, mais ces objets travailler avec les fils, pas de tâches. Par conséquent, ils ne sont pas la réponse.

Depuis lock() n'est pas une option, comment pouvez synchroniser plusieurs tâches?
En particulier, quel code dois-je écrire pour s'assurer que "SaveToFileAsync" est appelée qu'une seule fois à un moment?

N'est-ce pas "SaveToFileAsync" est appelée qu'une seule fois à un moment en indiquant que vous souhaitez utiliser la méthode pour exactement le contraire de ce qu'il a été conçu pour?
la seule chose qui vient à l'esprit est que vous souhaitez enregistrer dans 2 fichiers différents de manière asynchrone, mais souhaitez synchroniser l'accès au même fichier...
Vous pouvez utiliser une file d'attente à un autre processus de travail fonctionne.
Désactiver le Save bouton comme la première étape de la tâche et de le ré-activer la dernière étape.

OriginalL'auteur user380719 | 2012-04-12