我在后台工作人员的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事件,并且应用程序在那里停止。
答案 0 :(得分:1)
解决方案是全局声明Process,然后在本地对其进行初始化。这样,它就可以在整个应用程序中看到,并且我还可以在工作程序上调用CancelAsync()方法时按一下按钮就可以杀死它。