的过程.在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();
};
});
}
}
所有其他事件都没有任何问题。谢谢你
在订阅Exited
事件之前调用WaitForExit
,因此线程将在那里等待直到进程退出,并且在进程退出之前永远不会订阅事件。当WaitForExit
返回进程已经退出,然后只有你订阅Exited
事件,永远不会再次触发。
所以在调用WaitForExit
之前订阅Exited
事件。
process.Exited += (@Sender, args) =>
{
tcs.SetResult(process);
System.Windows.MessageBox.Show("Done");
process.Dispose();
};
process.WaitForExit();