Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Metoda BufferedStream.WriteByte(Byte) již neprovádí implicitní vyprázdnění, pokud je vnitřní vyrovnávací paměť plná. Tato změna zarovná chování BufferedStream.WriteByte s jinými Write metodami ve BufferedStream třídě, například BufferedStream.Write(Byte[], Int32, Int32) a BufferedStream.WriteAsync(Byte[], Int32, Int32, CancellationToken), které neprovádí implicitní vyprázdnění.
Verze byla představena
.NET 10
Předchozí chování
Dříve, když byla vnitřní vyrovnávací paměť BufferedStream plná, volání WriteByte automaticky vyprázdnilo vyrovnávací paměť do podkladového datového proudu. Toto chování bylo nekonzistentní s jinými Write metodami v BufferedStream.
Následující příklad ukazuje předchozí chování:
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
Nové chování
Počínaje .NET 10 metoda WriteByte už neprovádí implicitní vyprázdnění, pokud je vnitřní vyrovnávací paměť plná. Vyrovnávací paměť se vyprázdní pouze tehdy, když je explicitně volána metoda BufferedStream.Flush() nebo když je BufferedStream uvolněna.
Typ zásadní změny
Tato změna je změna chování.
Důvod změny
BufferedStream.WriteByte(Byte) implicitní chování vyprázdnění bylo nekonzistentní s jinými Write metodami ve BufferedStream třídě, například Write a WriteAsync. Tato nekonzistence může vést k neočekávaným problémům s výkonem systému nebo nežádoucím vedlejším účinkům při práci s datovými proudy, které jsou citlivé na operace vyprázdnění dat. Odstranění implicitního vyprázdnění zajišťuje konzistentní chování ve všech metodách Write v BufferedStream.
Doporučená akce
Pokud vaše aplikace spoléhá na implicitní chování BufferedStream.WriteByte vyprázdnění, aktualizujte kód tak, aby explicitně volal metodu Flush v případě potřeby. Například:
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