【发布时间】:2018-03-28 07:50:37
【问题描述】:
我正在使用Mutex 对象来防止应用程序的多个实例同时运行。
这是相关代码:
// class attribute
private static Mutex applicationMutex = new Mutex(true, "MyProgram");
// Main()
try
{
if (!applicationMutex.WaitOne(TimeSpan.Zero, true))
{
MessageBox.Show("Already running.");
Application.Current.Shutdown();
}
}
catch (AbandonedMutexException)
{
// pass
}
它似乎工作正常,但我注意到有时它似乎“挂起”:例如,如果我在调试时使用 Visual Studio 中的“停止”按钮终止程序,我通常无法重新启动我的应用程序,除非我断开了我的用户并重新登录。今天早上它甚至在重新启动后发生了!
我做错了什么?
【问题讨论】:
-
我也有过类似的挣扎。也就是说,如果我不小心在调试模式下发布了我的应用程序,在我的计算机上更新它,发现错误,在生产模式下发布,然后再次更新。然后错误发生在我身上。据我所知,Mutex 是你的 Windows 会话跟踪的东西,我还没有找到关闭“流氓”Mutex 的方法——它似乎是 Mutex 设计的一部分,所以你要么确保
Release您拥有 Mutex 或您必须注销并重新登录 Windows。至少这是我发现的。 -
难道不能捕获应用退出事件并释放互斥锁吗?这样程序就可以优雅地终止了。
-
Mutex是用于同步访问代码的原语。不适合以可靠的方式将访问同步到进程本身。您需要一个可靠的 util 应用程序,它可以作为“中间人”工作并监控您的主应用程序状态,如果它处于无响应状态则终止它。它可以检查正在运行的进程,将互斥锁设置为信号状态等...但它必须可靠,Windows 服务可能是一个不错的选择。