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

时间:2010-08-23 06:44:00

标签: c# process

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

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

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

7 个答案:

答案 0 :(得分: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");
}

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

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

答案 1 :(得分:4)

我在其中一个应用程序中执行的快速方法..您可以查看正在运行的进程列表,以查看当前应用程序是否已在运行,而不是再次启动应用程序。

Process[] lprcTestApp = Process.GetProcessesByName("TestApplication");
if (lprcTestApp.Length > 0)
{
      // The TestApplication is already running, don't run it again
}

答案 2 :(得分:2)

我认为列举进程列表可能会很慢。您还可以使用System.Threading.Mutex类创建一个Mutex,并检查它是否已在进程启动时创建。但是,这需要调用Win32系统代码,因此不会完全与平台无关。

答案 3 :(得分:2)

看看Scotts blog post,不要被程序集名称弄糊涂。它只是.Net框架中标准文件的文件名。

以下是有关WindowsFormsApplicationBase的MSDN的更多信息。

答案 4 :(得分:0)

您可以使用Semaphore和一个相当独特的名称来使用系统范围的Semaphore Constructor (Int32, Int32, String, Boolean%) constructor

干杯,马蒂亚斯

答案 5 :(得分:0)

如果您的应用程序生成/使用文件,那么您最好注册系统范围的通信机制(例如远程处理或WCF端点,甚至是套接字)。然后,如果通过双击其中一个文件启动应用程序的第二个实例,则可以将文件信息发送到正在运行的实例。

否则,如果它是一个独立的程序,那么就像其他人所说的那样,Mutex或Semaphore服务器同样会很好。

答案 6 :(得分:0)

Windows窗体应用程序中的

解决方案禁止再次运行应用程序(重新打开应用程序)。

1-首先添加Class RunAlready.cs

2-Call方法processIsRunning(),带有来自Program.cs中RunAlready.cs的Name Process

的Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Tirage.MainStand
{
static class Program
{

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        PublicClass.Class.RunAlready RunAPP = new PublicClass.Class.RunAlready();
        string outApp = RunAPP.processIsRunning("Tirage.MainStand");

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        MainStand_FrmLogin fLogin = new MainStand_FrmLogin();
        if (outApp.Length == 0)
        {

            if (fLogin.ShowDialog() == DialogResult.OK)
            {
                Application.Run(new MainStand_masterFrm());

            }
        }
        else MessageBox.Show( "Instance already running");

      }
    }
 }

类RunAlready:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PublicClass.Class
{
  public  class RunAlready
    {
      public  string processIsRunning(string process)
        {
        string xdescription = "";
        System.Diagnostics.Process[] processes =
            System.Diagnostics.Process.GetProcessesByName(process);
        foreach (System.Diagnostics.Process proc in processes)
        {
            var iddd = System.Diagnostics.Process.GetCurrentProcess().Id;
            if (proc.Id != System.Diagnostics.Process.GetCurrentProcess().Id)
            {
                xdescription = "Application Run At time:" + proc.StartTime.ToString() + System.Environment.NewLine;
                xdescription += "Current physical memory : " + proc.WorkingSet64.ToString() + System.Environment.NewLine;
                xdescription += "Total processor time : " + proc.TotalProcessorTime.ToString() + System.Environment.NewLine;
                xdescription += "Virtual memory size : " +         proc.VirtualMemorySize64.ToString() + System.Environment.NewLine;
            }
        }


        return xdescription;
    }
}
}