2012-02-08 55 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