c# – 我应该把KeepAlive放在我的finally块中吗?
作者:互联网
所以this告诉我,我应该在我的代码末尾添加一个GC.KeepAlive以保持我的互斥锁打开(以防止我的应用程序的多个实例由于早期GC处理我的互斥锁而发生).但是我应该将KeepAlive放在我的finally块中还是在try块的末尾?
解决方法:
我个人不会使用这种方法.
问题是您需要在应用程序代码(在本例中为表单)完成后使用互斥锁,或者它将成为GC后优化的候选者.
从Mutex implements 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()互斥锁 – 只要你以某种方式使用互斥锁,就可以了.
标签:c,net,garbage-collection,mutex,keep-alive 来源: https://codeday.me/bug/20190621/1257261.html