【发布时间】:2014-10-21 17:01:20
【问题描述】:
总结:
如果创建互斥锁的进程已经死掉了,有没有办法清除它?
详情:
我使用互斥锁来确保我的应用程序只有一个实例运行。
在测试一些新代码(进行自动更新)时,我运行了 Environment.Exit(0)。在调试模式下运行时,我的互斥体被清理得很好。
但是当我将构建更改为“发布”时,互斥锁会在退出调用后保留并被标记为已放弃:
我已仔细检查以确保没有任何进程仍在运行该互斥锁所附加到的进程。
现在每次我运行我的应用程序时,它都认为互斥锁仍然存在并且不会启动我的应用程序。 (它也会崩溃,因为它试图向应用程序的“当前运行”实例发送消息以显示自己。)
我试图像这样释放互斥锁:
bool createdNew;
string applicationId = "18773:TestStudio";
var singleInstanceMutex = new Mutex(true, applicationId, out createdNew);
singleInstanceMutex.Close(); // Tried ReleaseMutex() too
当然,这只是获取它然后释放它。
我知道我可以重新启动,但我希望得到更好的修复,以防在生产中发生这种情况。
如果创建互斥锁的进程已经死掉了,有没有办法清除它?
【问题讨论】:
-
根据您的屏幕截图,3 件事仍在引用它。关闭任何 3 件仍然有句柄的东西。
-
@Scott Chamberlain - 参考仍然存在,但过程早已不复存在。它以一种没有释放引用的方式死亡。因此我的问题是如何释放互斥锁。
-
@Vccano 那么你有两种情况之一。一个损坏的操作系统安装,或者一些你没有意识到引用的东西正在引用。如果它真的消失了,那么计数将为 0,在 Windows 95(或 98,我不记得是哪个)中修复了来自失败进程的句柄清理。可能的情况是程序还没有真正死掉,当你认为它已经死时,有些东西仍然让它活着,或者其他一些程序(IIS,一种防病毒软件,谁知道)正在拿起句柄而不放手。
-
您是否尝试过更改您的程序以按照我的代码的方式执行操作,看看是否可以避免问题发生?