2010-01-25 6 views
3

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.

+1

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 ... –

+0

Quels sites Web? Ça sent mauvais. – jason

+0

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

Répondre

10

Mutex est jetable. Pourquoi ne pas envelopper dans un using?

using(new Mutex(blah, blah, blah)){ 
    while(true){ 
     Blah(blah); 
    } 
} 

Notez que cela fonctionne sans même attribuer la nouvelle Mutex à une variable nommée.

+0

+1. Bonne solution, et vous mentionnez même l'alternative d'utiliser une variable statique. – RichardOD

+0

@RichardOD: L'utilisation d'une variable statique est une alternative. Je ne l'ai pas mentionné, cependant. –

+0

Quick Spider Man, utilisez votre bon sens! Je veux dire par là, merci pour cette excellente idée. –

1

Tout devrait bien se passer. Le point de GC.KeepAlive est juste pour que plus tard dans la fonction il y ait une référence à l'objet, et donc il n'est jamais éliminé. Le framework n'est pas assez intelligent pour savoir que votre boucle ne sortira jamais, donc il ne dispose jamais de l'objet.