Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Metoden BufferedStream.WriteByte(Byte) utför inte längre en implicit tömning när den interna bufferten är full. Den här ändringen justerar beteendet hos BufferedStream.WriteByte så att det stämmer överens med andra Write-metoder i BufferedStream-klassen, till exempel BufferedStream.Write(Byte[], Int32, Int32) och BufferedStream.WriteAsync(Byte[], Int32, Int32, CancellationToken), som inte utför en implicit spolning.
Version lanserad
.NET 10
Tidigare beteende
Tidigare, när den interna bufferten för en BufferedStream var full, tömdes bufferten automatiskt till den underliggande strömmen när WriteByte anropades. Det här beteendet var inkonsekvent med andra Write metoder i BufferedStream.
I följande exempel visas det tidigare beteendet:
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
Nytt beteende
Från och med .NET 10 WriteByte utför metoden inte längre en implicit tömning när den interna bufferten är full. Bufferten töms endast när metoden uttryckligen BufferedStream.Flush() anropas eller när den BufferedStream tas bort.
Typ av brytande ändring
Den här ändringen är en beteendeförändring.
Orsak till ändring
Det implicita tömningsbeteendet hos BufferedStream.WriteByte(Byte) var inkonsekvent med andra metoder i Write-klassen, till exempel BufferedStream och Write. Den här inkonsekvensen kan leda till oväntade prestandaproblem eller oavsiktliga biverkningar när du arbetar med strömmar som är känsliga för tömningsåtgärder. Om du tar bort implicit tömning säkerställs konsekvent beteende för alla Write metoder i BufferedStream.
Rekommenderad åtgärd
Om din applikation förlitar sig på implicit tömningsbeteende av BufferedStream.WriteByte, uppdatera koden för att uttryckligen anropa Flush-metoden när det behövs. Till exempel:
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