Console.Write+Flush verhält sich anders als Console.WriteLineC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Console.Write+Flush verhält sich anders als Console.WriteLine

Post by Anonymous »

Ich habe eine ausführbare net8.0-Datei unter Windows 11, die eine andere ausführbare Datei startet und dann auf deren Ausgabe wartet:

Code: Select all

public static int Main(string[] args)
{
var executable = @"hardcoded path to childprocess.dll";
var psi = new ProcessStartInfo(executable)
{
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
using var process = Process.Start(psi)!;
process.OutputDataReceived += (_, dataReceivedEventArgs) => ProcessOnOutputDataReceived(dataReceivedEventArgs, Console.Out);
process.BeginOutputReadLine();
process.WaitForExit();
return process.ExitCode;
}

private static void ProcessOnOutputDataReceived(DataReceivedEventArgs args, TextWriter textWriter)
{
// never called for Console.Write + Flush
// called without issues with Console.WriteLine
if (args.Data is var data and not null)
{
textWriter.WriteLine(data);
}
}
Dies funktioniert gut, wenn der untergeordnete Prozess Console.WriteLine verwendet, aber ich kann es nicht mit Console.Write + Flush zum Laufen bringen, was meiner Meinung nach gleichwertig wäre.

Code: Select all

public static void Main(string[] args)
{
Console.Write("Output never visible :(");
Console.Out.Flush();

// Console.WriteLine("This works perfectly fine!");
Console.ReadLine(); // just to stop the process from quitting.
}
Beim Debuggen des Codes sehe ich, dass _autoFlush sowieso aktiviert ist, daher sollte ich danach nicht einmal den expliziten Flush benötigen.
Für den Flush landen wir in ConsolePal ::WriteFileNative mit useFileAPIs auf true gesetzt, was bedeutet, dass wir am Ende Kernel32.WriteFile aufrufen, das die korrekt geschriebene Anzahl von Zeichen zurückgibt.
Aufruf FlushFileBuffers mit dem Dateihandle macht auch keinen Unterschied.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post