2008-12-27 81 views
1

好的,我有这个程序,我不想让它运行多个实例。所以我现在所拥有的是抓取与其名称匹配的所有实例,并且如果有多个实例会退出并让用户知道它已经在另一个实例中运行。防止第二个实例在特定情况下运行

但是,在新的实例会想改变什么另一个实例是干什么的,那么它将退出的一个特例。我怎样才能做到这一点?

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

这怎么办?

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

  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; 
      } 

回答

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 

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

+0

不应该命名管道能够处理消息吗? – configurator 2008-12-28 09:26:04

0

最好的办法是用互斥去检测,然后通过使用IPCChannel很琐碎远程处理。

只需要1 MarshalByRefObject的类和最初启动应用程序时,启动远程服务。

相关问题