【问题标题】:Close old instance of application关闭旧的应用程序实例
【发布时间】:2014-06-03 07:17:58
【问题描述】:

我正在开发一个程序,其中只有一个实例可以运行。我知道我可以应用互斥锁来防止多个实例运行。

但我想要它,所以如果应用程序的新实例运行,它应该终止旧实例。 可执行文件将始终具有相同的名称。

我尝试在表单加载事件上运行以下命令;

    Process[] pname = Process.GetProcessesByName(AppDomain.CurrentDomain.FriendlyName.Remove(AppDomain.CurrentDomain.FriendlyName.Length - 4));

    if (pname.Length > 1)
    {
        pname[0].Kill();
    }

这实际上有效.....每个蓝月亮一次。说真的,它可以工作.. 第一次,第二次应用程序根本无法加载。如果我再运行它大约 5 次,它可能会运行。

好像不太靠谱,有没有人有更优雅的解决方案?

谢谢!

【问题讨论】:

  • 这是订购的问题吗?我不确定你能保证pname[0] 不是新实例
  • 为什么新实例比旧实例更受欢迎?这个问题的大多数解决方案都是让新实例将数据传递给旧实例然后退出,这通常是一个更容易解决的问题。
  • 这对我的自动更新系统来说有点奇怪。但这正是我想要接近它的方式。我也相信这可能是排序的问题,但我认为列表中的第一个总是最旧的。我不知道如何检查它。
  • @Stella - 您的最后一条评论在我看来就像您正在寻找一种方法来重新启动您的应用程序并且只允许一个实例?
  • 好的,但即使在这种情况下,您也可以adapt 找到现有实例并将数据传递给它的解决方案之一 - 而不是传递数据,而是传递一个表示“请自行中止”的消息,然后旧实例可以处理实际退出。

标签: c#


【解决方案1】:

这对我有用

if (pname.Length > 1)
{
    pname.Where(p => p.Id != Process.GetCurrentProcess().Id).First().Kill();
}

【讨论】:

    【解决方案2】:

    你可以试试这段代码,而不是使用可执行文件名来获取进程

    Process currentProcess = Process.GetCurrentProcess();
    Process[] processItems = Process.GetProcessesByName(currentProcess.ProcessName);
    

    【讨论】:

    • 我已经把我的代码改成了这个,它肯定更优雅,但它给出了相同的结果。
    【解决方案3】:

    你可以改变你的逻辑。当您基于条件 pname 运行另一个实例时,为什么不调用 Environment.Exit。长度 ==1

    【讨论】:

    • 那你每次进程启动都要监控
    • 不,你不必监控,这个代码会在应用程序加载的时候被调用,如果它发现有一个已经在运行它会关闭我们正在尝试启动的当前那个。跨度>
    • 他试图关闭旧实例而不是新实例
    • 我猜目的是运行一个实例。
    • 这是我要避免的,新的必须运行,旧的必须终止。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多