Comment gracieusement sortir de AbandonedMutexException?
J'utilise le code suivant pour synchroniser mutuellement un accès exclusif à une ressource partagée entre plusieurs processus en cours d'exécution.
Le mutex est créé en tant que tel:
Mutex mtx = new Mutex(false, "MyNamedMutexName");
Puis-je utiliser cette méthode pour entrer mutuellement exclusifs l'article:
public bool enterMutuallyExclusiveSection()
{
//RETURN: 'true' if entered OK,
// can continue with mutually exclusive section
bool bRes;
try
{
bRes = mtx.WaitOne();
}
catch (AbandonedMutexException)
{
//Abandoned mutex, how to handle it?
//bRes = ?
}
catch
{
//Some other error
bRes = false;
}
return bRes;
}
et ce code à la quitter:
public bool leaveMutuallyExclusiveSection()
{
//RETURN: = 'true' if no error
bool bRes = true;
try
{
mtx.ReleaseMutex();
}
catch
{
//Failed
bRes = false;
}
return bRes;
}
Mais ce qui arrive est que si l'un des processus en cours d'exécution se bloque, ou si elle est annulée à partir d'un Gestionnaire de Tâches, le mutex peut retourner AbandonedMutexException
exception. Donc ma question est, quelle est la manière élégante de s'en sortir?
Cela semble bien fonctionner:
catch (AbandonedMutexException)
{
//Abandoned mutex
mtx.ReleaseMutex();
bRes = mtx.WaitOne();
}
Mais puis-je entrer dans l'mutuellement exclusifs l'article dans ce cas?
Quelqu'un peut-il préciser?
Vous devez vous connecter pour publier un commentaire.
Selon MSDN le AbandonedMutexException est:
Cela signifie que le thread dans lequel cette exception a été levée est le nouveau propriétaire de la Mutex (sinon, l'appel de la Mutex.ReleaseMutex Méthode comme vous êtes en train de faire pourrait déclencher un ApplicationException), et si vous pouvez vous assurer de l'intégrité des structures de données protégée par le mutex, vous pouvez tout simplement ignorer l'exception et de poursuivre l'exécution de votre application normalement.
Cependant, la plupart du temps la AbandonedMutexException est soulevée à l'intégrité des structures de données protégée par le mutex ne peut pas être garantie, et c'est pourquoi cette exception a été introduite dans la version 2.0 de l' .NET framework:
mtx.WaitOne()
de nouveau?