【问题标题】:Use already running application-instance [duplicate]使用已经运行的应用程序实例 [重复]
【发布时间】:2013-01-28 10:35:17
【问题描述】:

可能重复:
What is the correct way to create a single instance application?
How to implement single instance per machine application?

我有一个 Winform 应用程序,它接受一个参数作为参数。

static class Program
{

    [STAThread]
    static void Main(string[] args)
    {           
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Gauges(args));
    }
}

这个程序由另一个应用程序一天执行几次。

是否可以检查我的程序是否已经在运行,如果是,我可以使用带有最新参数的正在运行的实例吗?

【问题讨论】:

标签: c# winforms


【解决方案1】:

是否可以检查我的程序是否已经在运行

您可以在应用程序中使用Mutex

bool alreadyPresent  =false;
using (Mutex mutex = new Mutex(true, "YourAppName", out alreadyPresent  ))
{
    if(alreadyPresent ) {
       //APP ALREADY PRESENT 
    }
}

MutexOS 工件,因此,您的应用程序(可执行文件)的不同实例不能访问同一个对象。

我可以使用最新参数的运行实例吗?

这取决于您如何管理您的应用。您可以使用一些IPC 机制将所需的参数传达给已经运行的进程。

【讨论】:

  • Mutex构造函数的第三个参数实际上是createdNew。如果将参数设置为false,则应用程序(或另一个使用相同互斥体名称的应用程序)已在运行。
  • 我了解互斥锁。现在需要弄清楚 IPC 的东西。谢谢。
  • @Koen: 可以使用NamedPipe,但也有其他的。这只是一个例子。
  • @Tigran 谢谢。我去看看。
【解决方案2】:

您可以使用互斥锁停止运行的应用程序的多个副本。这里有一篇关于使用互斥锁的非常好的文章:http://sanity-free.org/143/csharp_dotnet_single_instance_application.html

关于将参数传递给已经运行的进程,您需要实现某种形式的 IPC 来通知正在运行的实例新参数。您可以使用多种解决方案,例如套接字、命名管道等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    相关资源
    最近更新 更多