的过程.在Task.Run中运行时未到达退出

本文关键字:退出 运行时 过程 Task Run | 更新日期: 2023-09-27 18:02:00

我在获取过程中遇到了问题。使用Task运行进程时触发的退出事件。在WPF应用程序中运行。如果由于进程类的限制,无法处理此退出事件,我想更新TextBox。任务完成时的文本。我尝试了ContinueWith,但也没有成功

async private void Select_Click(object sender, RoutedEventArgs e)
    {
        CancellationToken ct = new CancellationToken();
        CancellationTokenSource cts = new CancellationTokenSource();
        FolderBrowserDialog diag;
        TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
        Notification.Text = string.Empty;
        diag = new FolderBrowserDialog();
        var result = diag.ShowDialog();
        var istest = TestMode.IsChecked == true;
        if (result == System.Windows.Forms.DialogResult.OK)
        {
            var path = diag.SelectedPath;
            await Task.Run(() =>
            {
                var processStartInfo = new ProcessStartInfo()
                                {
                                    FileName = "cmd.exe",
                                    WindowStyle = ProcessWindowStyle.Hidden,
                                    RedirectStandardOutput = true,
                                    RedirectStandardError = true,
                                    RedirectStandardInput = true,
                                    UseShellExecute = false,
                                    CreateNoWindow = true
                                };
                var command="ping yahoo.com";
                var process = new Process() { StartInfo = processStartInfo, EnableRaisingEvents = true };
                process.Start();
                process.BeginOutputReadLine();
                process.BeginErrorReadLine();
                process.StandardInput.WriteLineAsync(command);
                process.ErrorDataReceived += (p, @event) =>
                {
                    Dispatcher.InvokeAsync(() =>
                    {
                        Notification.AppendText(String.Format("Error {0} {1}", @event.Data, Environment.NewLine));
                    }, System.Windows.Threading.DispatcherPriority.Background);
                };
                process.OutputDataReceived += (p, @event) =>
                {
                    Dispatcher.InvokeAsync(() =>
                    {
                        Notification.AppendText(@event.Data + Environment.NewLine);
                    }, System.Windows.Threading.DispatcherPriority.Background);
                };
                process.WaitForExit();
                process.Exited += (@Sender, args) =>
                {
                    tcs.SetResult(process);
                    System.Windows.MessageBox.Show("Done");
                    process.Dispose();
                };
            });
        }
    }

所有其他事件都没有任何问题。谢谢你

的过程.在Task.Run中运行时未到达退出

在订阅Exited事件之前调用WaitForExit,因此线程将在那里等待直到进程退出,并且在进程退出之前永远不会订阅事件。当WaitForExit返回进程已经退出,然后只有你订阅Exited事件,永远不会再次触发。

所以在调用WaitForExit之前订阅Exited事件。

process.Exited += (@Sender, args) =>
{
    tcs.SetResult(process);
    System.Windows.MessageBox.Show("Done");
    process.Dispose();
};
process.WaitForExit();