2014-01-06 138 views
0

我打開從控制檯應用程序的外部應用程序打開,如下所示:關閉應用.NET控制檯應用程序

var p = new Process 
{ 
    StartInfo = 
    { 
     FileName = "SomeApp.exe" 
    } 
}; 

p.Start(); 
Thread.Sleep(10000); 
p.CloseMainWindow(); //Bam!! InvalidOperationExcetion 

如何關閉SomeApp.exe?我正在圍繞這個應用程序構建一些自動化程序,並且我希望在完成這個應用程序時它會被關閉,但到目前爲止我還沒有成功。 p.CloseMainWindow()拋出一個類型爲InvalidOperationException的異常,並顯示消息「由於進程(1216)已退出而無法處理請求。」

我不是在殺死進程,我不知道什麼是殺死它。 我以管理員模式從Visual Studio運行此控制檯應用程序。

任何想法?預先感謝您

+0

問題'拋出一個異常,也許'p'沒有在那個點上運行? (也就是說,在你調用'Kill()'之前完成了它的工作,順便說一句,如果你能告訴我們你有什麼異常 – Shai

+0

有什麼例外..也許你只是沒有權利憑證 – i3arnon

+0

你會得到哪些例外?你能否在你的問題中提供這個問題? – jlafay

回答

3

當您致電.WaitForExit()當前進程等待,直到外部應用程序關閉。事後調用.Kill()毫無意義,因爲這個過程已經過去了。一個簡單的例子:

 var p = new Process 
     { 
      StartInfo = 
      { 
       FileName = "cmd.exe" 
      } 
     }; 

     p.Start(); 

     Console.WriteLine("press any key to kill the other app"); 
     Console.ReadKey(); 
     if (!p.HasExited) 
     { 
      p.Kill(); 
      Console.WriteLine("other app was killed"); 
     } 
     else 
     { 
      Console.WriteLine("other app was already dead"); 
     } 

     Console.ReadKey(); 

取決於你想要什麼,你可能也只是跳過調用.Kill()在當前的代碼 - 正如我所提到的,外部進程已經.WaitForExit()後消失。

+0

從另一個線程開始一個進程是沒有意義的!它開始於它自己的進程! –

+0

@ MD.Unicorn大聲笑,的確是那麼愚蠢,謝謝:) – BartoszKP

+0

我覺得是什麼問題。我是問題:)我通過快捷方式打開應用程序,而不是實際的exe。感謝您的幫助 – Dante

1

調用WaitForExit()會阻止調用線程,直到進程退出。所以之後沒有什麼可以殺死的!

在致電Kill()使用HasExited屬性並致電ClsoeMainWindow()關閉應用程序之前,您可以檢查線程的狀態。如果沒有工作,Kill過程:

var p = new Process 
{ 
    StartInfo = 
    { 
     FileName = "SomeApp.exe" 
    } 
}; 

p.Start(); 

// Do whatever... 

if (!p.HasExited) 
{ 
    if (!p.CloseMainWindow()) 
     p.Kill(); 
} 
+0

該進程在p後立即死亡。開始,因此我無法關閉我打開的應用程序,因爲該進程已被殺死。這並不能解決問題,但感謝您的幫助。 – Dante

+0

誰殺死了這個過程?它完成工作並自行關閉?這是必需的行爲嗎?您想關閉應用程序,並且它已關閉!有什麼問題? –

+0

我更新了我的問題。我打開了一個應用程序SomeApp.exe,該進程以某種方式死亡,但SomeApp.exe仍在運行。我想關閉SomeApp.exe。是否有意義? – Dante

1

這將要求應用程序關閉 - 這將使它能夠向用戶詢問他們是否要保存所有打開的文檔等

var p = new Process 
{ 
    StartInfo = 
    { 
     FileName = "SomeApp.exe", 
     ErrorDialog = true 
    } 
}; 

p.Start(); 
Thread.Sleep(5000);//or do whatever you need with the application 
p.CloseMainWindow(); 
p.WaitForExit(); 

這隻會結束這個過程。你仍然需要WaitForExit()因爲Process.Kill()異步運行

var p = new Process 
{ 
    StartInfo = 
    { 
     FileName = "SomeApp.exe", 
     ErrorDialog = true 
    } 
}; 

p.Start(); 
Thread.Sleep(5000);//or do whatever you need with the application 
p.Kill(); 
p.WaitForExit(); 

更新:加入ErrorDialog = true顯示一條消息,如果有,如果`p.Kill()啓動應用程序

+0

該進程在p.Start之後立即死亡,因此我無法關閉我打開的應用程序。當它到達p.CloseMainWindow()時,進程已被終止。任何其他想法? :)感謝您的回覆 – Dante

+0

聽起來像是您嘗試啓動的應用程序出現問題 - 是否需要任何參數?嘗試將StartInfo對象的ErrorDialog屬性設置爲true。 – Original10

+0

我想這是什麼問題。我是問題:)我通過快捷方式打開應用程序,而不是實際的exe。謝謝您的幫助 – Dante

相關問題