【问题标题】:StreamWriter loses string characters when writing to fileStreamWriter 写入文件时丢失字符串字符
【发布时间】:2018-12-27 06:34:23
【问题描述】:

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

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 将完整的字符串写入文件?

【问题讨论】:

  • 从哪里调用Work()?是单线程吗?是否有多个应用程序同时写入文件?
  • 为什么每次写完都脸红?
  • 这看起来并不真正是线程安全的(即使我们看不到相关的代码),如果您将FileShare.ReadWrite 更改为FileShare.Read,我会冒险猜测您会因为以下原因而出现访问错误2 个线程试图获得对同一文件句柄的独占写入访问权限
  • 删除writer.Flush();如果你使用关键字using则不需要
  • @John,Work() 在单线程中调用。在这种情况下,文件仅由一个应用程序实例使用。

标签: c# character streamwriter


【解决方案1】:

@TheGeneral 是对的。我有很多访问异常。错误出现在我的调用代码中(创建了几个线程而不是一个)。感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2012-01-02
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    相关资源
    最近更新 更多