v0.6.0-beta: stdout 重定向(管道)时,下载开始后的全部输出积压到进程退出才写出(Spectre.Console 0.52.1→0.57.1 回归)

Author: iibyteCoderCreated Aug 2, 2026Updated Aug 2, 2026

环境

  • Windows 11 x64
  • 对比版本:v0.6.0-beta (df70f0b, 20260628) vs v0.5.1-beta (20251029)

复现

将 stdout 重定向到管道(任何 GUI 包装器的典型场景)运行任意下载,按时间戳观察输出到达时机:

N_m3u8DL-RE.exe <任意m3u8> --auto-select --skip-merge --ffmpeg-binary-path <ffmpeg> > out.bin 2>&1

实际行为

  • v0.5.1-beta:进度帧(Vid <desc> ------ N/M x% size speed eta)按约 100ms 刷新实时逐帧写出,日志逐行到达,进程退出时无积压输出。
  • v0.6.0-beta:进度显示启动(Progress.StartAsync)之后的所有输出——包括 保存文件名开始下载...读取媒体信息...Done 等日志行,以及全部进度帧——都积压在进程内部,仅在进程退出瞬间一次性写出(实测为约 13KB 的单个块,EOF 前管道中无任何数据)。

带时间戳的抓包对比(v0.6.0-beta):

[+ 2.88s] OUT: ...已选择的流 / 写出meta json          ← 最后一批实时到达的输出
[+16.43s] OUT FINAL(13554B): 保存文件名...开始下载...Vid ...0/8...1/8...8/8 100%...Done   ← 全部积压到退出
[+16.43s] EXIT=0

v0.5.1-beta 同场景:

[+ 5.06s] OUT: 开始下载...Vid 1264x528 | ...          ← 实时
[+ 5.26s] OUT: Vid ... ------ 0/8 0.00% - 0.00Bps --:--:--   ← 进度帧实时逐帧
[+ 7.07s] OUT: Vid ... ------ 1/8 12.50% ...
[+ 7.88s] OUT: Vid ... ------ 8/8 100.00% ...
[+ 7.88s] EXIT=0   ← 无积压

影响

所有通过管道解析输出的 GUI 包装器在下载过程中完全拿不到进度数据,进度显示失效;退出时的一次性倾泻还会被 NonAnsiWriter[\r\n] + 正则剥掉换行,粘成无 \n 的单块,进一步增加解析方难度。

定位

回归来自 44861b1(2026-06-27)将 Spectre.Console 从 0.52.1-preview.0.5 升级到 0.57.1(次日随 v0.6.0-beta 发布)。0.57.1 重写了 ANSI 管线(独立的 Spectre.Console.Ansi 包:AnsiWriter / RenderPipeline / IRenderHook),live Progress 显示在非终端输出下的写出时机随之改变。Program.cs 的重定向检测分支(Console.IsOutputRedirectedForceAnsiConsole + NoAnsiColor)与 NonAnsiWriter 代码在此期间未变。

建议(供您选择)

  1. 回退 Spectre.Console 至 0.52.1-preview.0.5(恢复 0.5.1-beta 行为);
  2. 或在重定向模式下改用非 live 的逐行进度输出(每次刷新以独立日志行写出);
  3. 或增加一个面向 GUI 场景的"行缓冲/即时刷新进度输出"开关。

如需要,我可以补充更完整的抓包数据与最小复现脚本。