【发布时间】:2020-03-05 04:42:15
【问题描述】:
我使用 Windows 窗体编写了相同的应用程序,以便在按下按钮并读取其标准输出后运行进程。当我在 button1_Click() 中调用方法“test()”时,我的程序被阻塞了。但是当我在“Form1”构造函数中调用“test()”时,一切都按预期工作。问题出在哪里?
using System;
using System.Windows.Forms;
namespace DISMassistant
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
process1.StartInfo.RedirectStandardError = true;
process1.StartInfo.RedirectStandardOutput = true;
process1.StartInfo.UseShellExecute = false;
process1.StartInfo.FileName = "cmd.exe";
process1.StartInfo.Arguments = "/?";
}
public void button1_Click(object sender, EventArgs e)
{
}
public void test()
{
process1.Start();
process1.BeginOutputReadLine();
process1.BeginErrorReadLine();
process1.WaitForExit();
process1.CancelOutputRead();
process1.CancelErrorRead();
process1.Close();
}
private void process1_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
if (string.IsNullOrEmpty(e.Data)) return;
richTextBox1.Text += e.Data + "\n";
}
private void process1_ErrorDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
if (string.IsNullOrEmpty(e.Data)) return;
richTextBox1.Text += e.Data + "\n";
}
}
}
【问题讨论】:
-
不要使用 WaitForExit(),支持 Process.Exited 事件。或者根本不要等待,无论如何 process1 对象不再可用,因此清理没有那么有用。想知道你是否真的打算这样做。
-
这就是 WaitForExit 方法的工作原理。它会暂停当前线程,直到检测到远程进程已退出。
-
但是当我这样称呼它时它什么都没有阻塞:
code public Form1() { InitializeComponent(); process1.StartInfo.RedirectStandardError = true; process1.StartInfo.RedirectStandardOutput = true; process1.StartInfo.UseShellExecute = false; process1.StartInfo.FileName = "cmd.exe"; process1.StartInfo.Arguments = "/?"; test(); } -
您可以打印出两个调用的当前线程的名称,看看它们是否不同。很可能您的构造函数由与您的 button_click 处理程序不同的线程执行,该处理程序由 ui 线程调用。
-
你在哪里分配
OutputDataReceived事件?
标签: c# buttonclick waitforexit