Aktualizace FileStream.Position po dokončení operace ReadAsync nebo WriteAsync
FileStream.Position je nyní aktualizován po ReadAsync dokončení nebo WriteAsync dokončení.
Změna popisu
V předchozích verzích .NET ve Windows FileStream.Position byla aktualizována po spuštění asynchronní operace čtení nebo zápisu. Počínaje rozhraním .NET 6 FileStream.Position se aktualizuje optimisticky:
- Po WriteAsync spuštění, ale pokud operace selže nebo je zrušena, pozice se opraví.
- Když ReadAsync se spustí, ale pokud se nečte celá vyrovnávací paměť, pozice se opraví po dokončení operace.
Zavedená verze
.NET 6
Důvod změny
FileStream nikdy nebyla bezpečná pro přístup z více vláken, ale dokud se .NET 6 nepokoušela podporovat více souběžných volání svých asynchronních metod (ReadAsync a WriteAsync) ve Windows.
Tato změna byla zavedena tak, aby umožňovala 100% asynchronní vstupně-výstupní operace se FileStream soubory a opravila následující problémy:
- FileStream.FlushAsync nakonec provádí synchronní zápisy.
- Win32 FileStream změní asynchronní čtení na čtení synchronizace.
Doporučená akce
Pokud se spoléháte na FileStream.Position nastavení před spuštěním čtení nebo zápisu, protože váš kód provádí paralelní čtení nebo zápisy, měli byste místo toho přepnout na použití System.IO.RandomAccess rozhraní API. Rozhraní RandomAccess API je navržené pro paralelní operace se soubory.
Pokud chcete povolit chování .NET 5 v .NET 6, zadejte
AppContext
přepínač nebo proměnnou prostředí. Nastavením přepínače natrue
možnost se odhlásíte ze všech vylepšení výkonu provedenýchFileStream
v .NET 6.{ "configProperties": { "System.IO.UseNet5CompatFileStream": true } }
set DOTNET_SYSTEM_IO_USENET5COMPATFILESTREAM=1
Důležité
Tento přepínač je k dispozici pouze v .NET 6. Byl odebrán v .NET 7.