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