从C#winform中杀死一个顽固的任务

时间:2012-03-07 12:40:45

标签: c# multithreading backgroundworker task kill

我正在使用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!");
        }
    }
不过,如果我打开命令任务并单击停止按钮,命令任务就会被杀死...

如何从停止按钮中杀死后台工作人员的命令任务...... ??

3 个答案:

答案 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()