【问题标题】:Checking the instances of running app and kill it检查正在运行的应用程序的实例并杀死它
【发布时间】:2009-07-13 05:20:03
【问题描述】:

我正在使用 c# windows 应用程序。

当我的应用程序启动时,我想检查 同一应用程序的任务管理器。如果任何实例已经在运行, shud 杀死进程并启动新进程。

这是为了确保只有一个应用程序实例正在运行。

【问题讨论】:

    标签: c#-3.0


    【解决方案1】:

    这是一种确保只有一个程序实例在运行的快速而肮脏的方法。秘诀是使用互斥锁。

    [STAThread]
    static void Main()                  
    {
        bool ok;
        m = new System.Threading.Mutex(true, "YourNameHere", out ok);
    
        if (!ok)
        {
            MessageBox.Show("Another instance is already running.");
            return;
        }
    
        // Do some stuff here...
    
        GC.KeepAlive(m);                
    }
    

    此代码尝试创建具有特定名称的 Mutex(互斥),如果无法创建,则该程序的实例必须已在运行。

    【讨论】:

    • 这段代码需要做一些工作,因为它不处理废弃的互斥锁
    • 是的,你是对的。我想你可以在互斥体上调用 WaitOne 方法,如果它失败,捕获 AbandonedMutexException 错误并适当地处理事情。这也不是一个真正好的解决方案。就像我说的,它又快又脏。 :p
    【解决方案2】:

    对我来说,这听起来很激进,可能不是最好的主意。

    也许你想maintain a single instance of your app

    【讨论】:

    • 点击链接了解更多关于互斥锁解决方案的信息。
    【解决方案3】:
    public Process[] ExistingProcesses()    
    {
        string processName = Process.GetCurrentProcess().ProcessName;
        Process[] processes = Process.GetProcessesByName(processName);
        return processes;
    }
    

    【讨论】:

      【解决方案4】:

      检查现有实例的传统方法是使用命名句柄,例如互斥体,而不是依赖于进程名称,甚至可能通过重命名可执行文件而意外失败。启动时检查是否已经存在,如果存在则立即关闭。

      编辑

      我刚刚又读了一遍这个问题,听起来你真的想杀死前一个实例,而不是杀死新实例。我记得最接近这种行为的是谷歌浏览器在你打开一个新窗口而旧窗口没有响应时所做的事情,但即使这样也会检查没有响应,然后提示用户。杀死旧进程听起来有点极端。你确定那是你想要做的吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-09
        • 2015-08-01
        • 1970-01-01
        • 2015-06-16
        • 2012-12-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多