2008-12-27 86 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的類和最初啓動應用程序時,啓動遠程服務。

相關問題