c# - 为什么 Process.StandardOutput.ReadToEnd 与常规 StreamReader.ReadToEnd 的行为不同?
问题描述
现在是凌晨 2 点,我很困惑为什么Process.StandardOutput.ReadToEnd()
会这样。不知何故,它设法仅在完成后读取进程的所有输出,而不是仅读取标准输出的一部分(这是预期的,因为进程是异步运行的。)
ReadToEnd
结合Process.WaitForExit()
; 它不是单独使用的。ReadToEnd
完全按照文档中的说明工作,但是当我尝试使用 a MemoryStream
、 aStreamReader
和 asynchronous来模拟它时StreamWriter
,会StreamReader.ReadToEnd()
立即返回,而输出与StreamWriter
. 不是那Process.ReadToEnd
行不通;我只是对为什么会这样感到困惑。
这是执行文件的代码:
public static void Main(string[] args){
for(int i = 0;i<50;i++){
Console.WriteLine($"some string {i}");
Thread.Sleep(arbritraryDelay);
}
}
这是测试代码:
void ProcessTest(){
var process = new Process
{
StartInfo = new ProcessStartInfo()
{
FileName = "dotnet",
Arguments = "executedFile.dll",
UseShellExecute = false,
RedirectStandardOutput = true
}
};
process.Start();
var result = process.StandardOutput.ReadToEnd();
process.WaitForExit();
//Result is the entire output
}
void SimulatedTest(){
using(var stream = new MemoryStream()){
var writer = new StreamWriter(stream);
var reader = new StreamReader(stream);
Task.Run(() => {
for(int i = 0;i<50;i++){//Near identical code to the executed file
writer.Writeline($"some string {i});
Thread.Sleep(arbritraryDelay);
}
}
);
var result = reader.ReadToEnd(); //different output
}
}
我希望ProcessTest
行为与 相同SimulatedTest
,但ProcessTest
实际上捕获了所有输出。
解决方案
推荐阅读
- python - 如何使用 python 多处理使类变量在 windows 和 linux 上的行为相同?
- curl - 如何修复 AWS EC2 卷曲错误 303 查看其他
- groovy - 如何从groovy中的地图中获取最后一个KEY?
- akka - 如何从入口返回值
- android - RecyclerView 中的 CustomView 出现故障(项目被交换、消失或重复)
- xcode - react-native 0.60.4 xcode 构建失败
- html - 100% 高度不适用于移动视图上的身体背景图像
- python - np.abs() 和 pd.TimedeltaIndex 为列表中的 pd.TimedeltaIndex(['0 days']) 抛出错误
- swift - 如何使用 IBInspectable 在属性检查器中设置夜间模式和日间模式颜色?
- algorithm - 加权无向树获得的最大利润