を使用して対GC.KeepAlive、マイケル・コヴィントンこのコードを提示:アプリケーションの彼の<a href="http://www.ai.uga.edu/~mc/SingleInstance.html" rel="noreferrer">article about preventing multiple instances</a>で
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!
}
彼はGC.KeepAlive(m)は、早期ミューテックスを収集から、ガベージコレクタを防ぐために必要であることを説明して追加の参照がないためです。
私の質問:mutexをラッピングして同じことをしますか?つまり、以下のこともGCが私の下から敷物を引き出すのを妨げますか?
Mutex m = new System.Threading.Mutex(true, "YourNameHere", out ok);
try
{
// do stuff here
}
finally
{
m.Close();
}
そして、私はm.Close()は十分にあるだろうと思うだろう:
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
}
}
私の腸の反応が使用しているため、動作します使用することと同じ(のはず)されていることですJITコンパイラに別の参照があることを通知し、早すぎるガベージコレクションを防止します。確かにゴミが収集されることを防ぐことができますusing
文でmutexをラッピング
私はCLRの専門家ではありません(なぜ私は回答を追加していません)が、あなたがしていることはうまくいくはずです。私はそれを試してみると言う。 –
GCについて話すとき、「試してみてください」というのは悪い考えです。テストがうまくいくはずだったが、生産に失敗したケースがあった。リリースとデバッグモードでJITコンパイラがどのように動作するかの違いが多くあります。 –