Уничтожение внешнего процесса внутри фонового работника - PullRequest
1 голос
/ 23 июня 2019

У меня есть этот код в 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.Код выше, похоже, успешно завершает процесс (он больше не отправляет выходные данные отладки), но по какой-то причине событие завершения работника никогда не запускается, и приложение останавливается на этом.

1 Ответ

1 голос
/ 23 июня 2019

Решением было объявить процесс глобально, а затем инициализировать его локально. Таким образом, это было видно во всем приложении, и я смог убить его при нажатии кнопки, в то время как я также вызывал метод CancelAsync () на рабочем месте.

...