Compartilhar via


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:

  • 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ção true, você opta por cancelar todas as melhorias de desempenho feitas ao FileStream 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.

APIs afetadas