杀死后台工作者内部的外部进程

时间:2019-06-23 18:06:22

标签: c# process backgroundworker

我在后台工作人员的DoWork中包含以下代码:

Process downloadConvert = new Process();
downloadConvert.StartInfo.FileName = @"process.exe";
downloadConvert.StartInfo.Arguments = "args here";
downloadConvert.StartInfo.UseShellExecute = false;
downloadConvert.StartInfo.RedirectStandardOutput = true;
downloadConvert.StartInfo.RedirectStandardError = true;
downloadConvert.StartInfo.CreateNoWindow = true;
downloadConvert.EnableRaisingEvents = true;
downloadConvert.OutputDataReceived += (s, er) =>
{
    Debug.WriteLine(er.Data);
    if (er.Data != null && er.Data != "")
    {
        metadata trackInfo = JsonConvert.DeserializeObject<metadata>(er.Data);
        title.Add(trackInfo.title);
    }

    if (fetchInfoBW.CancellationPending == true)
    {
        e.Cancel = true;
        downloadConvert.Kill();
        downloadConvert.WaitForExit();
        return;
    }
};

downloadConvert.Start();
downloadConvert.BeginOutputReadLine();
downloadConvert.WaitForExit();

我已经为我的工作人员添加了取消支持,我希望在我按下按钮后退出。由于工作进程实际上是进程本身,并且进程在活动状态下一直在发送输出,因此我试图找到一种从OutputDataReceived终止/终止/停止它的方法。上面的代码似乎可以成功杀死进程(不再发送调试输出),但是由于某种原因,永远不会触发worker的completed事件,并且应用程序在那里停止。

1 个答案:

答案 0 :(得分:1)

解决方案是全局声明Process,然后在本地对其进行初始化。这样,它就可以在整个应用程序中看到,并且我还可以在工作程序上调用CancelAsync()方法时按一下按钮就可以杀死它。