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