Partilhar via


streamWriterBufferedDataLost MDA

The streamWriterBufferedDataLost Assistente de depuração gerenciada (MDA) é ativado quando um StreamWriter é gravado, mas o Flush ou Close método não é chamado antes da instância do subseqüentemente o StreamWriter é destruído. Quando este MDA é ativado, o tempo de execução determina se quaisquer dados armazenados em buffer ainda existem dentro de StreamWriter. Se houver dados armazenados em buffer, o MDA é ativado.Chamando o Collect e WaitForPendingFinalizers métodos podem forçar os finalizadores para executar. Finalizadores caso contrário, serão executado em momentos arbitrários aparentemente e possivelmente não funcionar na sair do processo.Executando explicitamente finalizadores com este MDA habilitado ajudará a forma mais confiável reproduzir esse tipo de problema.

Sintomas

A StreamWriter não grava de 1 a 4 última KB de dados para um arquivo.

Causa

The StreamWriter buffers de dados internamente, o que requer que o Close ou Flush método ser chamado para gravar dados em buffer para o armazenamento de dados subjacente. If Close ou Flush não é adequadamente chamado, sistema autônomo dados armazenados em buffer na StreamWriter instância não pode ser gravada sistema autônomo esperado.

A seguir é um exemplo de código mal escrito que este MDA deve capturar.

// Poorly written code.
void Write() 
{
    StreamWriter sw = new StreamWriter("file.txt");
    sw.WriteLine("Data");
    // Problem: forgot to close the StreamWriter.
}

O código precedente será ativado este MDA mais confiável se uma coleta de lixo é disparada e, em seguida, suspenso até que tenham terminado de finalizadores.Para rastrear esse tipo de problema, você pode adicionar o código a seguir ao participante do método anterior em uma compilação de depurar.Isso ajudará para ativar o MDA confiável mas obviamente não corrigir a causa do problema.

    GC.Collect();
    GC.WaitForPendingFinalizers();

Resolução

Certifique-se de que você telefonar Close ou Flush sobre o StreamWriter antes de fechar um aplicativo ou qualquer bloco de código que possui uma instância de um StreamWriter. Um dos mecanismos de melhores para conseguir isso é criar a instância com um translation from VPE for Csharp using bloquear)Using no Visual Basic), que garantirão a Dispose método para o gravador é invocado, resultando na instância que está sendo fechada corretamente.

using(StreamWriter sw = new StreamWriter("file.txt")) 
{
    sw.WriteLine("Data");
}

O código a seguir mostra a mesma solução usando try/finally em vez de using.

StreamWriter sw;
try 
{
    sw = new StreamWriter("file.txt"));
    sw.WriteLine("Data");
}
finally 
{
    if (sw != null)
        sw.Close();
}

Se nenhuma dessas soluções pode ser usada (por exemplo, se um StreamWriter é armazenado em um estático variável e você não pode executar com com facilidade código ao participante da sua tempo de vida), em seguida, chamar Flush sobre o StreamWriter Após seu último uso ou a configuração do AutoFlush propriedade para true antes de seu primeiro uso deve evitar esse problema.

private static StreamWriter log;
// static class constructor.
static WriteToFile() 
{
    StreamWriter sw = new StreamWriter("log.txt");
    sw.AutoFlush = true;

    // Publish the StreamWriter for other threads.
    log = sw;
}

Efeito sobre o tempo de execução

Este MDA não tem efeito sobre o tempo de execução.

Saída

Uma mensagem indicando que essa violação.

Configuração

<mdaConfig>
  <assistants>
    <streamWriterBufferedDataLost />
  </assistants>
</mdaConfig>

Consulte também

Conceitos

Diagnosticar erros com assistentes de depuração gerenciadas

Referência

StreamWriter