【发布时间】:2020-12-28 01:04:14
【问题描述】:
我希望程序在已经运行时不再运行。
当我使用调试模式时代码可以工作,但在发布时无法正常工作。
代码如下。
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
string mtxName = "test mutex";
Mutex mtx = new Mutex(true, mtxName);
TimeSpan tsWait = new TimeSpan(0, 0, 1);
bool success = mtx.WaitOne(tsWait);
if (!success)
{
MessageBox.Show("is running.");
return;
}
Application.Run(new Form1());
【问题讨论】:
-
在副本中查看(当前)第二个(通过投票)答案。你需要一个全局互斥体。
-
@runRyan 我复制了您的代码示例,尝试在 Release 配置中重现该问题(同时启动 2 个应用程序),但无法实现。我为 AnyCPU、x86 和 x64 编译 - 没有区别,我总是收到“正在运行”消息。请在问题中添加更多详细信息 - 您使用什么 .NET 框架以及 CLR version 是什么(我尝试使用 .NET4.6 和 CLR 4.0.30319.42000)
-
@fenixil 我想你会写多次关于 application.run(new form1());对吗??
-
总之,我的主要问题是为什么当我使用调试模式和发布模式时它会以不同的方式发生。
-
@runRyan,我不关注您关于 application.run 多次的问题,请详细说明。正如 RossBush 指出的那样,问题在于您没有对互斥锁的引用,因此它被 GC 释放和销毁。原因,为什么一切都在调试模式下工作,是因为编译器生成“更安全”的代码并在线程堆栈中保存对互斥体的引用。在 Release 中,这不会发生,因为代码更加优化。