J'ai quelques applications en cours d'exécution dans des processus distincts qui écrivent chacun à un document xml central sur le disque dur. J'utilise un mutex nommé pour synchroniser l'accès au dossier - mais obtenir l'exception suivante souvent:File.Exists() et la synchronisation d'accès aux fichiers à travers les processus
System.IO.IOException: The requested operation cannot be performed on a file with a user-mapped section open.
je réalisais que je fais appel à la méthode File.Exists()
avant d'obtenir un verrou sur le mutex, est-il possible que cela pourrait être la cause?
Plus simplement, quelqu'un peut-il confirmer si cette méthode fait une lecture sur le fichier pour vérifier si elle existe? Je me demande si je dois verrouiller le mutex avant de vérifier si le fichier est présent. J'ai vérifié qu'il n'y avait pas de logiciel AV en cours d'exécution, car cela semblait être commun avec cette exception.
exemple rugueux du code actuel:
private bool UpdateFile(string Text)
{
if (!File.Exists(@"C:\FileName.xml"))
return false;
else
{
using (Mutex mutex = new Mutex(false, "ExampleMutexName"))
{
mutex.WaitOne();
//Write to the file
mutex.ReleaseMutex();
}
return true;
}
}
EDIT: Je n'utilisais pas un mutex global, car tout se passe à l'intérieur du même compte utilisateur - si je croyais un mutex local serait bien. Cependant, l'un des processus que je commence est avec l'emprunt d'identité - c'est pourquoi je DEVRAIS avoir utilisé un mutex global. Mon erreur était juste de penser que tout fonctionne avec le même compte d'utilisateur et serait bien.
Je doute fortement que votre code actuel grossier contribue à cette erreur - il est ailleurs ... – t0mm13b
En regardant la trace de la pile de l'exception vous dira quelle fonction dans votre code l'a causé. –
Notez que votre nom de mutex doit commencer par "Global \" afin qu'il soit globalement visible dans toutes les sessions Windows en cours (voir la section de remarque ici: http://msdn.microsoft.com/en-us/library/f55ddskf.aspx –