防止ac#应用程序运行多个实例

Dat*_*ase 6 c# process

我在c#中编写了一个程序,现在我想知道如果程序已经运行,阻止程序启动的正确方法是什么?

因此,如果它已经在运行,并且双击该程序,它将无法启动,因为它已经在运行.

我可以这样做,但我正在考虑一种标准和正确的方式.

Bin*_*ier 10

建议的方法是使用系统互斥锁.

bool createdNew;
using(var mutex = new System.Threading.Mutex(true, "MyAppName", out createdNew))
{
    if (createdNew)
        // first instance
        Application.Run();
    else
        MessageBox.Show("There is already an instace running");
}
Run Code Online (Sandbox Code Playgroud)

Mutex ctor的第一个参数告诉它为该线程创建一个系统范围的互斥锁.如果Mutex已经存在,它将false通过第3个参数返回.

更新
在哪里放这个?我把它放在program.cs中.如果将其放在form_load中,则需要在应用程序的生命周期内保留互斥锁(将互斥锁作为表单上的成员),然后以卸载形式手动释放它.
在其他应用程序打开数据库连接等之前以及为表单/控件等创建资源之前,您越早调用它越好.

  • 如果这已经封装在[WindowsFormsApplicationBase](http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.applicationservices.windowsformsapplicationbase.issingleinstance.aspx)中,我认为这不是*推荐方式* (2认同)
  • @BinaryWorrier --WindowsFormsApplicationBase是.NET框架的标准部分,可在每次安装时使用.VB位于命名空间中更能说明哪个团队编写了它而不是其他任何东西.它从C#应用程序中完美运行 - 没有理由避免它. (2认同)