我想讓它如此,如果我的程序的另一個實例正在運行,它應該關閉已運行的實例並啓動新實例。我目前試過這樣:如果程序正在運行,殺死其他實例?
[STAThread]
static void Main()
{
Mutex mutex = new System.Threading.Mutex(false, "supercooluniquemutex");
try
{
if (mutex.WaitOne(0, false))
{
// Run the application
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new fMain());
}
else
{
foreach (Process proc in Process.GetProcesses())
{
if (proc.ProcessName.Equals(Process.GetCurrentProcess().ProcessName) && proc.Id != Process.GetCurrentProcess().Id)
{
proc.Kill();
break;
}
}
// Run the application
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new fMain());
}
}
finally
{
if (mutex != null)
{
mutex.Close();
mutex = null;
}
}
}
但由於某些原因,它不殺已經運行的情況下,它只是殺死自己的大部分時間,有時它不會做任何事情。
我該如何做到這一點?
編輯:我知道這樣做是顯示該應用程序已在運行的消息的常用方法,但在這種應用中,它殺死了老工藝而不是顯示一個消息是至關重要的。
那麼你是說當你正在調試時它碰到'proc.Kill();'語句,它不會導致進程被終止? –
我認爲你只是不想開始新的實例,而不是從一個已經執行的實例下拉開地毯。您可以向用戶顯示一條消息,然後關閉以清楚表明它無法啓動....除非您不關心其他應用程序實例在做什麼(將某些內容保存到某個商店,請求,用戶做某事等)。也考慮可能的終端服務器含義......(承載多個同時登錄的服務器)。 – Igor
你的確意識到* common *模式是爲了讓新實例關閉而轉換舊的(轉移了任何參數/將舊參數帶到前面)。讓用戶以其他方式採取行動會讓你感到非常驚訝。 –