Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die BufferedStream.WriteByte(Byte) Methode führt keine implizite Spülung mehr aus, wenn der interne Puffer voll ist. Diese Änderung gleicht das Verhalten von BufferedStream.WriteByte an andere Write Methoden in der BufferedStream Klasse an, wie z. B. BufferedStream.Write(Byte[], Int32, Int32) und BufferedStream.WriteAsync(Byte[], Int32, Int32, CancellationToken), die keine implizite Spülung ausführen.
Eingeführt in Version
.NET 10
Vorheriges Verhalten
Wenn der interne Puffer eines BufferedStream voll war, hat der Aufruf von WriteByte zuvor automatisch den unterliegenden Stream geleert. Dieses Verhalten war inkonsistent mit anderen Write Methoden in BufferedStream.
Im folgenden Beispiel wird das vorherige Verhalten veranschaulicht:
StreamWithFlush streamWithFlush = new();
BufferedStream bufferedStream = new(streamWithFlush, bufferSize: 4);
// Write 4 bytes to fill the buffer
bufferedStream.WriteByte(1);
bufferedStream.WriteByte(2);
bufferedStream.WriteByte(3);
bufferedStream.WriteByte(4); // In .NET 9 and earlier, this caused an implicit flush
class StreamWithFlush : MemoryStream
{
public override void Flush()
{
Console.WriteLine("Flush was called.");
base.Flush();
}
}
Module PreviousBehaviorExample
Sub Example()
Dim streamWithFlush As New StreamWithFlush()
Dim bufferedStream As New BufferedStream(streamWithFlush, bufferSize:=4)
' Write 4 bytes to fill the buffer
bufferedStream.WriteByte(1)
bufferedStream.WriteByte(2)
bufferedStream.WriteByte(3)
bufferedStream.WriteByte(4) ' In .NET 9 and earlier, this caused an implicit flush
End Sub
Class StreamWithFlush
Inherits MemoryStream
Public Overrides Sub Flush()
Console.WriteLine("Flush was called.")
MyBase.Flush()
End Sub
End Class
End Module
Neues Verhalten
Ab .NET 10 führt die WriteByte Methode keine implizite Spülung mehr aus, wenn der interne Puffer voll ist. Der Puffer wird nur geleert, wenn die BufferedStream.Flush() Methode explizit aufgerufen wird oder wenn BufferedStream freigegeben wird.
Art der einschneidenden Änderung
Diese Änderung ist eine Verhaltensänderung.
Grund für Änderung
Das implizite Flush-Verhalten von BufferedStream.WriteByte(Byte) war inkonsistent mit anderen Methoden von Write in der BufferedStream Klasse, wie z. B. Write und WriteAsync. Diese Inkonsistenz könnte zu unerwarteten Leistungsproblemen oder unbeabsichtigten Nebenwirkungen führen, wenn Sie mit Datenströmen arbeiten, die für Löschvorgänge empfindlich sind. Das Entfernen des impliziten Flush stellt ein konsistentes Verhalten für alle Write Methoden in BufferedStream sicher.
Empfohlene Aktion
Wenn Ihre Anwendung auf das implizite Flush-Verhalten BufferedStream.WriteByteangewiesen ist, aktualisieren Sie den Code so, dass die Flush Methode bei Bedarf explizit aufgerufen wird. Beispiel:
Before:
BufferedStream bufferedStream = new(new MemoryStream(), bufferSize: 4);
bufferedStream.WriteByte(1);
bufferedStream.WriteByte(2);
bufferedStream.WriteByte(3);
bufferedStream.WriteByte(4); // Implicit flush occurred here in .NET 9 and earlier
Dim bufferedStream As New BufferedStream(New MemoryStream(), bufferSize:=4)
bufferedStream.WriteByte(1)
bufferedStream.WriteByte(2)
bufferedStream.WriteByte(3)
bufferedStream.WriteByte(4) ' Implicit flush occurred here in .NET 9 and earlier
After:
BufferedStream bufferedStream = new(new MemoryStream(), bufferSize: 4);
bufferedStream.WriteByte(1);
bufferedStream.WriteByte(2);
bufferedStream.WriteByte(3);
bufferedStream.WriteByte(4);
bufferedStream.Flush(); // Explicit flush
Dim bufferedStream As New BufferedStream(New MemoryStream(), bufferSize:=4)
bufferedStream.WriteByte(1)
bufferedStream.WriteByte(2)
bufferedStream.WriteByte(3)
bufferedStream.WriteByte(4)
bufferedStream.Flush() ' Explicit flush