2012-02-08 56 views
2

我有一個c#GUI應用程序,它正在運行一堆命令行進程。如何在命令行進程運行時結束/終止應用程序? 我有一個退出按鈕(按鈕3),但它不工作,如果所調用的進程仍在運行。圖形用戶界面Winform和結束/查殺進程

private void Run_Process(string process_to_run, string p_arg) 
    { 
     Process myProcess = new Process(); 
     richTextBox1.AppendText("\nRunning " + process_to_run); 

     try 
     { 
      myProcess.StartInfo.UseShellExecute = false; 
      myProcess.StartInfo.FileName = process_to_run; 
      myProcess.StartInfo.Arguments = p_arg; 
      myProcess.StartInfo.CreateNoWindow = true; 
      myProcess.Start(); 
      myProcess.WaitForExit(); 
      richTextBox1.AppendText("...Success"); 
      time_date = get_time(); 
      log_file.Write(time_date); 
      log_file.WriteLine(process_to_run + "...Success"); 

     } 

     catch (Exception ep) 
     { 
      richTextBox1.AppendText("\n" + ep.Message); 
      time_date = get_time(); 
      log_file.Write(time_date); 
      log_file.WriteLine(process_to_run + "...Failed. ERROR: " + ep.Message); 
     } 
    }  

    private void button3_Click(object sender, EventArgs e) 
    { 
     db.connection.Close(); 
     Application.Exit(); 
    } 
+0

殺死正在運行此代碼的應用程序或終止運行該命令的命令提示符? – 2012-02-08 16:59:13

回答

1

現在,你在等待的過程中退出:

myProcess.WaitForExit(); 

如果這是在UI線程中發生的事情,那麼你將無法退出(乾淨),直到方法完成,這意味着您必須等待該過程完成。

如果您不等待進程,您可以立即退出。

您應該能夠通過設置Process.EnableRaisingEvents然後在流程中訂閱Exited事件來修改您的邏輯,以不阻止。您可以在此事件中將文字添加到RichTextBox,而不是阻止主線程。

+0

我需要保持WaitForExit()。問題是我有一個接一個的進程調用。我寧願立即殺死進程,下一個進程也不會執行。你能舉個例子嗎? – 2012-02-08 17:54:56

+0

@JohnRyann在這種情況下,你可以在後臺線程中做到這一點,並殺死當前進程。如果你在UI線程上調用WiatForExit,你會阻止並得到這個問題。 – 2012-02-08 17:56:23

0

您在Run_Process中撥打myProcess.WaitForExit();。如果從主線程調用Run_Process,則將阻止該線程,直到命令行工具完成。這意味着button3_Click()只有在myProcess完成後才能觸發。

0

如果您需要退出並立即退出,請嘗試Environment.Exit

Environment.Exit方法

終止此過程,並給出了底層操作系統指定的退出代碼。

+0

他不會因爲他的UI線程被阻塞而獲得按鈕點擊。 – Zenexer 2012-02-09 04:32:40

0

Environment.Exit(1);真的有用。

+0

更改答案格式 – SGG 2014-05-14 09:16:07