Atualizações de FileStream.Position após a conclusão de ReadAsync ou WriteAsync
FileStream.Position agora é atualizado após a conclusão de ReadAsync ou WriteAsync.
Descrição das alterações
Nas versões anteriores do .NET no Windows, FileStream.Position era atualizado após o início da operação assíncrona de leitura ou gravação. A partir do .NET 6, FileStream.Position é atualizado de forma otimista:
- Após WriteAsync iniciar, mas se a operação falhar ou for cancelada, a posição será corrigida.
- Quando ReadAsync inicia, mas se todo o buffer não for lido, a posição será corrigida após a conclusão da operação.
Versão introduzida
.NET 6
Motivo da alteração
O FileStream nunca foi thread-safe, mas até o .NET 6, o .NET tentou dar suporte a várias chamadas simultâneas para os métodos assíncronos (ReadAsync e WriteAsync) no Windows.
Essa alteração foi introduzida para permitir E/S de arquivo 100% assíncrona com FileStream e para corrigir os seguintes problemas:
- FileStream.FlushAsync acaba fazendo gravações síncronas
- Win32 FileStream transforma leituras assíncronas em leituras sincronizadas
Ação recomendada
Se você depende de FileStream.Position ser definido antes do início da leitura ou gravação porque seu código executa leituras ou gravações paralelas, você deve mudar para usar a API System.IO.RandomAccess. A API RandomAccess foi projetada para operações paralelas de arquivos.
Para habilitar o comportamento do .NET 5 no .NET 6, especifique uma opção
AppContext
ou uma variável de ambiente. Ao definir a opçãotrue
, você opta por cancelar todas as melhorias de desempenho feitas aoFileStream
no .NET 6.{ "configProperties": { "System.IO.UseNet5CompatFileStream": true } }
set DOTNET_SYSTEM_IO_USENET5COMPATFILESTREAM=1
Importante
Essa opção só está disponível no .NET 6. Ela foi removida no .NET 7.