C# 路径进程冻结

本文关键字:冻结 进程 路径 | 更新日期: 2023-09-27 18:35:28

我正在创建一个网络诊断应用程序并尝试向其添加路径命令,当我按下按钮时,它从文本字段中获取地址作为 ping 的路径,但是当我按下按钮时应用程序冻结并且输出窗口中没有任何内容显示。

private void btn_PingPath_Click(object sender, EventArgs e)
{
    ProcessStartInfo PathPingStartInfo = new ProcessStartInfo();
    PathPingStartInfo.FileName = "CMD.EXE";
    PathPingStartInfo.UseShellExecute = false;
    PathPingStartInfo.CreateNoWindow = true;
    PathPingStartInfo.RedirectStandardOutput = true;
    PathPingStartInfo.RedirectStandardInput = true;
    PathPingStartInfo.RedirectStandardError = true;
    PathPingStartInfo.StandardOutputEncoding = Encoding.GetEncoding(850);
    Process PathPing = new Process();
    PathPing.StartInfo = PathPingStartInfo;
    PathPing.Start();
    PathPing.StandardInput.WriteLine("PATHPING " + txt_PingPath.Text);
    while (PathPing.StandardOutput.Peek() > -1)
    {
        txt_Output.Text = PathPing.StandardOutput.ReadLine();
    }
    while (PathPing.StandardError.Peek() > -1)
    {
        txt_Output.Text = PathPing.StandardError.ReadLine();
    }
    //txt_Output.Text = PathPing.StandardOutput.ReadToEnd();
    PathPing.WaitForExit();
}

编辑

我从另一个问题中找到了while loop,但没有帮助。我在输出文本窗口中仍然没有输出,应用程序仍然冻结。

C# 路径进程冻结

PATHPING 命令在退出之前可能会运行几分钟,因此您的最后一行PathPing.WaitForExit();也不会在几分钟内返回(或直到路径退出)。你不能在 UI 线程上这样等待,因为 UI 还需要使用此线程来重新绘制和侦听 Windows 消息。

可以通过创建新线程、使用 .Net 4.5+ 中的异步/等待功能或使用事件模式来释放 UI 线程,以便应用程序不会冻结。以下示例使用事件模式。

private void btn_PingPath_Click(object sender, EventArgs e)
{
    ProcessStartInfo PathPingStartInfo = new ProcessStartInfo();
    PathPingStartInfo.FileName = "CMD.EXE";
    PathPingStartInfo.UseShellExecute = false;
    PathPingStartInfo.CreateNoWindow = true;
    PathPingStartInfo.RedirectStandardOutput = true;
    PathPingStartInfo.RedirectStandardInput = true;
    PathPingStartInfo.RedirectStandardError = true;
    PathPingStartInfo.StandardOutputEncoding = Encoding.GetEncoding(850);
    Process PathPing = new Process();
    PathPing.StartInfo = PathPingStartInfo;
    PathPing.Start();
    PathPing.StandardInput.WriteLine("PATHPING " + txt_PingPath.Text);
    PathPing.StandardInput.Flush();
    PathPing.OutputDataReceived += (o, args) => txt_Output.Text += args.Data;
    PathPing.ErrorDataReceived += (o, args) => txt_Output.Text += args.Data;
    PathPing.BeginErrorReadLine();
    PathPing.BeginOutputReadLine();
}