Должен ли я поместить KeepAlive в свой блок finally? - PullRequest
4 голосов
/ 06 октября 2010

Итак, , это говорит мне, что я должен поместить GC.KeepAlive в конец моего кода, чтобы сохранить мой мьютекс открытым (чтобы предотвратить множественные экземпляры моего приложения из-за раннего GC избавление от моего мьютекса). Но я должен поместить KeepAlive в мой блок finally или в конце моего блока try?

1 Ответ

5 голосов
/ 06 октября 2010

Лично я бы не использовал этот подход.

Проблема в том, что вам нужно что-то использовать, используя мьютекс после завершения кода приложения (в данном случае, формы), или это будет кандидатом для пост-оптимизации GC.

Поскольку Mutex реализует IDisposable , вы можете так же легко сделать это:

[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());
    }
}

Это будет работать так же хорошо, так как окончательно созданный оператор using не позволит мьютексу быть кандидатом в GC. Лично я считаю этот код менее запутанным и понятным.

При этом, если вы хотите следовать подходу по этой ссылке, простое размещение KeepAlive в любом месте приведет к тому, что мьютекс не будет собран, и предотвратит проблему. Вы можете поместить его в свой блок try или finally - до тех пор, пока он не завершит основной код приложения. Вы также можете игнорировать это и просто явно Dispose() мьютекс - если вы каким-то образом используете мьютекс, все будет хорошо.

...