2014-10-19 206 views
0

我的應用程序在啓動時檢查是否有任何其他實例正在運行,如果是,則會關閉所有其他實例。爲此,我嘗試使用Process.GetProcessByName(「AppName」)函數,並將AppName的所有進程存儲在進程[]數組中。現在我想找到當前實例的PID,這樣我可以關閉我的應用程序的所有其他實例(顯然它們具有相同的名稱,但具有不同的PID)。但是,即使經過大量的谷歌搜索,我仍然無法找到。另外我怎樣才能找到我的應用程序的一個實例的PID,我使用從AppName.exe中調用的Process.Start(「AppName.exe」)函數創建的如何在運行時使用C#獲得我的應用程序的PID#

+1

[獲得在C#創建進程的PID]的可能重複(HTTP:/ /stackoverflow.com/questions/2539920/getting-a-pid-of-a-process-created-in-c-sharp) – Chris 2014-10-19 22:33:47

回答

0

OK,與我的其他解決方案的特定問題,請參閱以下

爲了進程之間鉤,你需要某種形式的IPC的。要使用EventWaitHandles之間的共享句柄的簡單性,可以讓每個程序監聽取消標誌。

public static EventWaitHAndle CancellationEvent = 
    new EventWaitHandle(
     false, 
     EventResetMode.AutoReset, 
     "MyAppCancel"); 
private object lockObject = new object(); 

後來......

Task.Run(() => 
{ 
    while(true) 
    { 
     CancellationEvent.WaitOne(); 
     lock(lockObject) 
      if(!thisIsCalling) // static bool to prevent this program from ending itself 
       Environment.Exit(0); 
    } 
} 

,然後調用取消像這樣

lock(lockObject) 
{ 
    thisIsCalling = true; 
    CancellationEvent.Set(); 
    thisIsCalling = false; 
} 
+0

謝謝。它似乎工作正常。乾杯。 :) – Sanyam 2014-10-19 23:05:40

0

爲什麼不直接檢查您的當前處理?

var processes = Process.GetProcessByName("AppName"); 

foreach (var p in processes) 
{ 
    if (p != Process.GetCurrentProcess()) 
     p.CloseMainWindow(); 
} 
0

如果您有興趣關閉應用程序的其他實例,爲什麼不做相反的事情並防止多個實例首先打開?使用的EventWaitHandle可正是如此做:

bool created; 
var eve = new System.Threading.EventWaitHandle(
    false, 
    EventResetMode.AutoReset, 
    "MyAppHandle", 
    out created); 
if(!created) 
{ 
    eve.Set(); 
    Environment.Exit(-1); // Always use an exit error code if you're expecting to call from the console! 
} 

手柄參數,在這種情況下,「MyAppHandle」,將整個系統共享,從而意味着不僅將out created paramete放在次要instaces假的,但你可以使用eve.Set()使句柄觸發acorss應用程序。設置一個監聽線程,當您嘗試打開第二個實例時,這可以允許消息循環顯示消息。

Task.Run(() => 
{ 
    while(true) 
    { 
     eve.WaitOne(); 
     // Display an error here 
    } 
} 
+0

謝謝Aravol。但我的應用程序的其他實例正在同時爲其他目的而工作。所以我也需要其他實例,但是在某些時候我必須關閉它們(當它們的關聯文件的工作結束時)。 – Sanyam 2014-10-19 22:45:33

+0

在這種情況下,這是無用的!然而,你看到類似的IPC,所以讓我給你提供另一個答案〜 – David 2014-10-19 22:46:36

相關問題