C# C“ProcessStartInfo读取输出”;“生活”;(同期)

C# C“ProcessStartInfo读取输出”;“生活”;(同期),c#,wpf,multithreading,process,C#,Wpf,Multithreading,Process,我正在尝试编写一个控制台包装器WPF gui,它只运行一部分.bat文件,我希望能够查看.bat文件“live”的任何输出(就像它在cmd中运行一样) 我已经研究了OutputDataReceived和事件处理程序,它们附加文本,然后将其发送到屏幕,但是它仍然要等到进程完成后,屏幕上才会出现任何内容 如何使.bat的输出“实时”显示 到目前为止我的代码片段(这是一个表单): 表单有一个按钮(go)和一个多行文本字段(textArea) 其中my foo.bat只是一个for循环: ECHO O

我正在尝试编写一个控制台包装器WPF gui,它只运行一部分.bat文件,我希望能够查看.bat文件“live”的任何输出(就像它在cmd中运行一样)

我已经研究了OutputDataReceived和事件处理程序,它们附加文本,然后将其发送到屏幕,但是它仍然要等到进程完成后,屏幕上才会出现任何内容

如何使.bat的输出“实时”显示


到目前为止我的代码片段(这是一个表单):

表单有一个按钮(
go
)和一个多行文本字段(
textArea

其中my foo.bat只是一个for循环:

ECHO OFF

FOR /L %%i IN (1,1,10) DO (
   echo %%i
   ping -n 2 127.0.0.1 >nul
)

是的,当您在
ExecuteCommand
中等待进程退出时,您当前正在阻止主线程(即UI线程),该进程直接从UI线程调用(在
go\u单击

只需启动一个新线程(或使用
ThreadPool
)(Winforms示例):


如果您使用的是WPF,您可能希望使用。

是的,您当前正在阻止主线程(即UI线程),因为您正在等待进程退出
ExecuteCommand
,该进程直接从UI线程调用(在
中单击

只需启动一个新线程(或使用
ThreadPool
)(Winforms示例):


如果您使用的是WPF,可能需要使用。

如果您希望保持简单,只需使用/K参数启动命令提示符并传入批处理文件即可

string arguments = @"z:\foo.bat";

Process.Start("cmd.exe", "/K " + arguments);

cmd.exe/K将打开,命令提示符将运行foo.bat,但仍保留在屏幕上。

如果希望保持简单,可以使用/K参数启动命令提示符并传入批处理文件

string arguments = @"z:\foo.bat";

Process.Start("cmd.exe", "/K " + arguments);
cmd.exe/K将打开,并在命令提示符下运行foo.bat,但仍保留在屏幕上

string arguments = @"z:\foo.bat";

Process.Start("cmd.exe", "/K " + arguments);