6
我運行了一個進程,該進程在帶有參數的命令行中執行一個exe文件,並且需要時間才能完成。同時,我將窗體顯示爲帶進度條和取消按鈕的對話框。當按下取消按鈕時,過程應該中止/停止。我有兩種方法可以做到這一點:取消正在運行的進程
A.聲明Process類的公共靜態對象的主要形式和取消按鈕被點擊時從進度形式終止它:
public partial class frmMain : Form
{
public static Process Process = new Process();
public static bool ExecuteCommand(string sCommandLineFile, string sArguments)
{
Process.StartInfo.FileName = sCommandLineFile;
Process.StartInfo.Arguments = sArguments;
Process.StartInfo.CreateNoWindow = true;
Process.StartInfo.UseShellExecute = false;
Process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
Process.Start();
Process.WaitForExit();
}
}
而且從接近/中止進程進度窗口形式:
public partial class frmProgress : Form
{
private void btnCancel_Click(object sender, EventArgs e)
{
frmMain.Process.Close();
frmMain.Process.Dispose();
}
}
B.或者不要調用Process.WaitForExit();而是使用Process.HasExited檢查正在運行的進程,並取消它,如果取消按鈕被點擊:
public static bool IsCancelled = false;
Process.StartInfo.FileName = sCommandLineFile;
Process.StartInfo.Arguments = sArguments;
Process.StartInfo.CreateNoWindow = true;
Process.StartInfo.UseShellExecute = false;
Process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
while (!Process.HasExited)
{
Thread.Sleep(100);
Application.DoEvents();
if (IsCancelled)
{
Process.Close();
Process.Dispose();
}
}
public partial class frmProgress : Form
{
private void btnCancel_Click(object sender, EventArgs e)
{
frmMain.IsCancelled = true;
}
}
什麼是做正確的方式?
無需輪詢'Process.HasExited'只需執行'frmMain.Process.CanRaiseEvents = true',然後訂閱[Exited](https://msdn.microsoft.com/en-us/library/system.diagnostics .process.exited(v = vs.110).aspx)事件。 –