写入文件

时间:2018-12-27 06:34:24

标签: c# character streamwriter

在某些情况下,我不得不编写自己的简单记录器。将条目写入文件的方法在单独的线程中运行,如下所示:

using System.Collections.Generic;
using System.Collections.Concurrent;
using System.IO;
using System.Text;    

private ConcurrentQueue<Event> OccuredEvents { get; }

private void Work()
{
    using (FileStream fs = new FileStream (filename, FileMode.Append, 
        FileAccess.Write, FileShare.ReadWrite)
    {
        using (StreamWriter writer = new StreamWriter(fs))
        {
            while (OccuredEvents.TryDequeue(out Event currentEvent))
            {
                 writer.WriteLine(currentEvent.ToString());
                 writer.Flush();
            }
        }
    }
}

有时在文件中会出现一些这样的条目:

27.12.2018 08:49:13 [3e2291e2-a489-45ed-b169-fcc6b7bd1eda] [INFO] AcceptCallback - Client accepted (172.23.64.31:49820)
:49:13 [3e2291e2-a489-45ed-b169-fcc6b7bd1eda] [INFO] GenerateResponse - AliveCommand | Data | AccountName: DOMAIN_KVC\07221147

或:

27.12.2018 08:49:13 [3e2291e2-a489-45ed-b169-fcc6b7bd1eda] [INFO] GenerateResponse - AliveCommand | Data | A27.12.2018 08:49:13 [3e2291e2-a489-45ed-b169-fcc6b7bd1eda] [INFO] AcceptCallback - Client accepted (172.23.7.86:49593)

如图所示,部分条目丢失或覆盖了另一部分。这种异常的出现取决于条目的数量。日志记录密集的应用程序会产生大部分“存根”。

我的错误是什么?如何强制StreamWriter将完整字符串写入文件?

1 个答案:

答案 0 :(得分:3)

@TheGeneral是正确的。我有很多访问例外。我的调用代码有误(创建了多个线程而不是一个)。谢谢大家的帮助!