Je travaille actuellement sur une application en C# qui s'exécute sur une boucle infinie avec un appel Thread.Sleep après chaque itération des autres appels de méthode. Mon principal est -Comment implémenter un motif singleton avec une boucle infinie - C#
static void Main(string[] args)
{
bool isOnlyInstance = false;
Mutex mutex = new Mutex(true, "RiskMetricsSensitivitiesDatabaseLoader", out isOnlyInstance);
if (!isOnlyInstance)
{
return;
}
while (true)
{
ProcessData();
Thread.Sleep(MainLoopSleep);
}
GC.KeepAlive(mutex);
}
J'ai inséré l'appel KeepAlive à la fin de la méthode pour assurer la mutex singleton fonctionne comme prévu, tel que décrit par divers sites Web. L'appel à KeepAlive est supposé empêcher le garbage collection de jeter le mutex, puisque .NET attend impatiemment d'anticiper/optimiser le garbage collection.
Ma question est, puisque l'appel réel à KeepAlive n'est jamais atteint, dois-je le mettre dans la boucle après Thread.Sleep? Le compilateur avertit que KeepAlive n'est jamais appelé, et je crains qu'il ignore donc cette ligne dans mon algorithme de prévention de la récupération de place.
Mettez-le dans un bloc finally si vous êtes si concerné. Bien sûr, cela ne devrait pas faire de différence, puisque la boucle est infinie - elle appellera seulement "KeepAlive()" juste avant que le programme ne s'arrête ... –
Quels sites Web? Ça sent mauvais. – jason
Je ne vois pas pourquoi le GC devrait collecter votre Mutex si vous avez toujours une référence à celui-ci (comme il semble). Pourriez-vous fournir des liens vers les sites Web qui mentionnent ce problème? – LorenzCK