我正在使用c#winform打开批处理文件。 我想让用户按下winform中的“停止”按钮并终止此任务。 问题是winform冻结自己,直到批处理文件的运行完全完成。 所以我使用了后台工作程序(这使我能够打开一个不打扰winform功能的新线程):
private void bgw_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
string fileName = (string)e.Argument;
ExecuteTest(fileName);
}
并注意到我进入“调试!”消息,但命令进程不会死:
private void tsbStopRun_Click(object sender, EventArgs e)
{
Process prc1 = GetProcess("cmd");
KillProcess(prc1);
}
private Process GetProcess(string processName)
{
Process[] Prc = Process.GetProcessesByName(processName);
if (Prc.Length > 0)
return Prc[0];
else
return null;
}
private void KillProcess(Process prc)
{
if (prc != null)
{
prc.Kill();
MessageBox.Show("debug!");
}
}
不过,如果我打开命令任务并单击停止按钮,命令任务就会被杀死...
如何从停止按钮中杀死后台工作人员的命令任务...... ??
答案 0 :(得分:2)
来自MSDN
Kill方法异步执行。在调用Kill方法之后,调用WaitForExit方法以等待进程退出,或者检查HasExited属性以确定进程是否已退出。
所以这意味着Kill可能无法在一段时间内停止该过程。
更改KillProcess方法以等待退出代码并查看响应所需的时间。在等待Kill执行此操作时,您可能需要提醒用户您正在等待它终止。
private void KillProcess(Process prc)
{
if (prc != null)
{
prc.Kill();
prc.WaitForExit(); //this has an [override][2] in which you can specify time
MessageBox.Show("debug!");
}
}
答案 1 :(得分:1)
你需要记住你凝视的过程。做这样的事情:
private Process _commandProcess = null;
private void tsbStartRun_Click(object sender, EventArgs e)
{
_commandProcess = new Process();
//Start process here.
}
private void tsbStopRun_Click(object sender, EventArgs e)
{
_commandProcess.Kill();
MessageBox.Show("debug!");
}
答案 2 :(得分:0)
我为我写的自定义构建服务做了类似的事情。我创建了一个属性来跟踪过程。
public Process CurrentProcess { get; set; }
然后,当您在后台工作线程中进行工作时,您可以初始化并启动该过程。
this.CurrentProcess = new Process();
//other initialization
this.CurrentProcess.Start()
然后,您应该能够访问该属性以终止该进程。根据您实现此操作的方式,您可能希望在尝试终止进程之前检查CurrentProcess属性是否为null,或者即使后台工作程序正在运行,也可能需要检查。
this.CurrentProcess.Kill()