除特定情况外,防止第二个实例运行

时间:2008-12-27 21:28:21

标签: c# multithreading process

好的,我有这个程序,我不想要运行它的多个实例。所以我现在所拥有的是它抓住所有与其名称相匹配的实例,如果有多个实例退出并让用户知道它已经在另一个实例中运行。

但是,有一种特殊情况,新实例需要更改其他实例正在执行的操作,然后它将退出。我怎么能这样做?

这是一个例子: 我有这个计划,是一个事件。我不希望同时运行多个因为你不能同时做两件事(对于这个应用程序)。现在说第三方程序想要通知该线程用户现在正在处理其他事情,因此它再次启动应用程序。如果应用程序已在运行,它将更新它的操作,否则它将正常运行。

如何做到这一点?

这是我用来判断是否还有另一个实例在运行:

            string proc = Process.GetCurrentProcess().ProcessName;

            Process[] processess = Process.GetProcessesByName(proc);
            if (processess.Length > 1) {
                MessageBox.Show("There is an instance of the Timer already running");
                return;
            }

3 个答案:

答案 0 :(得分:2)

使这一点复杂化的事实是,在某些情况下,如果另一个程序正在运行,您希望允许第二次调用程序执行某些操作。使用命名的互斥锁将允许您检测程序是否已在运行 - 它应该已经持有互斥锁。您仍然需要一种与它通信的方法,以告诉正在运行的程序在第二个运行时执行某些操作。异步消息队列可能会起作用,您只需要让正在运行的程序定期检查它以查看是否有任何新消息在等待。该消息需要告诉程序如何更改。查看System.Threading命名空间(因为它看起来你已经在使用.Net),特别是互斥和信号量类,以及System.Messaging.MessageQueue用于消息交换。

基本理念是:

  program start
  try to acquire mutex (or semaphore)
  if failed
     send message via message queue to running program
     exit
  else

  set up listener for message queue

  run rest of program

侦听器可以采用定时器的形式,定时器到期时使用到期回调检查队列中的消息并相应地更新程序操作。计时器需要自动复位,以便它可以回到收听状态。您的程序需要能够从计时器中断恢复,并根据更新的配置“重新启动”。

答案 1 :(得分:1)

您可以使用共享(命名)互斥锁。

参见Win32 API documentation for Mutex objects(我假设C#对此有语言绑定)。

答案 2 :(得分:0)

您最好的选择是使用Mutex进行检测,然后通过IPCC通道使用非常简单的远程处理。

所需要的只是1个MarshalByRefObject类,并在最初启动应用程序时启动远程服务。