【问题标题】:Enforce one instance of an application winform c#强制应用程序winform c#的一个实例
【发布时间】:2020-05-27 07:03:35
【问题描述】:

如果不在应用程序中使用全局互斥锁,是否有任何安全的方法来确保系统上只有一个应用程序实例正在运行?我发现在内存中的应用程序生命周期中发生的错误和错误可能会导致系统内出现许多问题,尤其是在与全局互斥锁相匹配的情况下。任何建议将不胜感激。

感谢阅读。

【问题讨论】:

  • @jason.kaisersmith 谢谢你的帖子。我研究了这个解决方案,但似乎这个功能适用于 VB winform 应用程序而不是 c# winform 应用程序。我签入了 VS,并没有看到 c# winform 类型应用程序的选项。不过,我很感谢您的及时回复。任何其他建议将不胜感激。谢谢!
  • an answer 枚举进程以检查是否已经在运行。如果您不喜欢互斥锁,其他想法是创建具有独占访问权限的文件。但总的来说,使用try/finally 的互斥体(如this answer,其中using 确保释放互斥体)就足够了。
  • 我并不完全反对使用互斥锁,但我担心如果在我的应用程序生命周期内在内存中发生异常或错误并且应用程序无法从这些错误中恢复,互斥锁可能会使应用程序无响应和/或容易出错,从而使系统处于不良状态,例如未定义状态。 try catch finally 块对于应用程序上的互斥锁来说是理想的吗?为您提供更多详细信息,该应用程序是多线程的,带有系统计时器。感谢您的投入!

标签: c# winforms


【解决方案1】:

您可以使用Mutex 来确保单实例应用。 将以下代码放入您的 WinForms 应用程序的 Main 函数中:

static class Program
{
    static Mutex mutex = new Mutex(true, "<some_guid_or_unique_name>");

    [STAThread]
    static void Main()
    {
        if (mutex.WaitOne(TimeSpan.Zero, true))
        {
           // do the app code
           Application.Run();

           // release mutex after the form is closed.
           mutex.ReleaseMutex();
           mutex.Dispose();
        }
    }
}

【讨论】:

  • JeremyRock,感谢您的宝贵时间和建议!我已经调查过了,我会试试的。感谢您阅读这篇文章!
猜你喜欢
  • 1970-01-01
  • 2010-09-29
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多