【问题标题】:Mutex is already created before creating first instanceMutex 在创建第一个实例之前已经创建
【发布时间】:2021-12-02 07:47:31
【问题描述】:

我有一个程序在启动时检查它是否已经在运行:

Mutex mutex = new Mutex(true, "Programname", out createdNew);
if (!createdNew)
{
    MessageBox.Show("The program is already running.");
    return;
}  

这已经工作了很多年。现在一些客户说他们在第一次运行程序时重新启动 Windows 后得到了这个。

微软改变了什么?这个系统有缺陷吗?

编辑: 事实证明这是正确的,用户启动了两次。问题是它在启动过程中使用的时间比平时长,并且没有显示窗口。所以用户又开始了......我应该删除问题吗?

【问题讨论】:

  • 使用WinObj。并检查哪个进程拥有该互斥锁。
  • Programname 是不是一个简单、直接的词或一些其他程序也可能选择的词?我几乎总是建议使用 GUID 或其他 极不可能被意外复制 字符串。
  • 如果我以管理员身份运行它并运行我自己的程序,我会在 WinObj 中找到它。但是我发现没有提到什么程序拥有它,即使我在这种情况下知道。有小费吗?名称不是Programname,而是out company的名称和程序名称,命名应该不会崩溃。

标签: c# mutex


【解决方案1】:

我可以想象

  1. 用户告诉 Windows 重新启动,但它不是由于正在运行的程序。我注意到如果某些应用程序没有关闭,最新版本的 Windows 最终会返回登录屏幕。
  2. 用户双击事物,启动多个副本。

您可能希望将行为更改为不显示消息框,而是向持有锁的应用程序发送消息/信号,告诉它“请聚焦或恢复窗口并在完成后响应”。

如果在一段时间内收到响应,您可以关闭当前实例。如果未收到响应,您可能会询问用户“另一个应用程序正在运行但似乎没有响应,您要重新启动吗?”

这需要更多的代码,但应该会带来更好的用户体验。

【讨论】:

  • 它实际上工作正常,只是来自 Windows/用户的错误信息,正如您在 1 中所暗示的那样。在显示窗口之前,IT 使用的时间比平时要长,因此用户启动了两次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多