2010-10-05 5 views
4

Donc this me dit que je devrais mettre un GC.KeepAlive à la fin de mon code pour garder mon mutex ouvert (pour éviter que plusieurs instances de mon application ne se produisent en raison de la mise à disposition précoce de mon mutex par le GC). Mais dois-je mettre le KeepAlive dans mon bloc finally ou à la fin de mon bloc try?Devrais-je mettre KeepAlive dans mon bloc finally?

+2

Voir ceci: http://stackoverflow.com/questions/635640/gc-keepalive-versus-using –

Répondre

5

Personnellement, je n'utiliserais pas cette approche. Le problème est que vous devez avoir quelque chose utiliser le mutex après que votre code d'application (dans ce cas, le formulaire) soit terminé, ou il sera candidat pour les post-optimisations du CPG.

Depuis Mutex implements IDisposable, vous pouvez aussi le faire facilement:

[STAThread] 
static void Main()     // args are OK here, of course 
{ 
    bool ok; 
    using(var mutex = new System.Threading.Mutex(true, "YourNameHere", out ok)) 
    { 
     if (!ok) 
     { 
      MessageBox.Show("Another instance is already running."); 
      return; 
     } 

     Application.Run(new Form1()); 
    } 
} 

Cela fonctionne tout aussi bien, puisque la finalement créée par l'instruction à l'aide empêchera le mutex d'être un candidat de GC. Personnellement, je trouve ce code moins déroutant et plus propre. Cela étant dit, si vous voulez suivre l'approche à partir de ce lien, en mettant KeepAlive n'importe où, le mutex ne sera pas collecté et empêchera le problème. Vous pouvez le mettre à l'intérieur de votre try ou finalement bloquer - tant que c'est après que le code de l'application principale "se termine". Vous pouvez également ignorer ceci et juste explicitement Dispose() le mutex - tant que vous utilisez le mutex d'une manière ou d'une autre, tout ira bien.

Questions connexes