In seiner article about preventing multiple instances einer Anwendung verwendet wird, stellt Michael Covington diesen Code:GC.KeepAlive gegen
static void Main() // args are OK here, of course
{
bool ok;
m = new System.Threading.Mutex(true, "YourNameHere", out ok);
if (! ok)
{
MessageBox.Show("Another instance is already running.");
return;
}
Application.Run(new Form1()); // or whatever was there
GC.KeepAlive(m); // important!
}
Er erklärt, dass die GC.KeepAlive (m) erforderlich, um den Garbage Collector von der Erhebung der Mutex früh zu verhindern , da es keine zusätzlichen Hinweise darauf gibt.
Meine Frage: wickelt der Mutex in einer Verwendung die gleiche Sache? Das heißt, wird das Folgende auch verhindern, dass der GC den Teppich unter mir wegzieht?
static void Main() // args are OK here, of course
{
bool ok;
using (var m = new System.Threading.Mutex(true, "YourNameHere", out ok))
{
if (! ok)
{
MessageBox.Show("Another instance is already running.");
return;
}
Application.Run(new Form1()); // or whatever was there
}
}
Mein Bauchgefühl ist, dass das funktioniert verwenden, da die Verwendung ist (sein soll) entspricht:
Mutex m = new System.Threading.Mutex(true, "YourNameHere", out ok);
try
{
// do stuff here
}
finally
{
m.Close();
}
Und ich würde denken, dass die m.Close() es ausreichen würde, um dem JIT-Compiler zu signalisieren, dass es eine weitere Referenz gibt, wodurch eine vorzeitige Speicherbereinigung verhindert wird.
Ich bin kein CLR-Experte (weshalb ich keine Antwort hinzufügen), aber es scheint mir, dass das, was Sie tun, sollte funktionieren. Ich sage es ausprobieren und sehen. –
Wenn man über den GC spricht, ist "ausprobieren und sehen" eine schlechte Idee. Ich hatte Fälle, in denen Tests sagten, dass es funktionieren sollte, aber es scheiterte in der Produktion. Vieles hat mit dem Unterschied zu tun, wie der JIT-Compiler im Release-Debug-Modus arbeitet. –