礼仪和/或写入文件的最佳方式

时间:2017-08-30 14:15:28

标签: c# .net file-io

我目前正在质疑一段代码,关于它的有效性和资源消耗。以下是将编译为DLL的全局日志记录实用程序方法。该方法可以同时访问。

private static void Log(string logType,
                        string severity,
                        object sender,
                        string format,
                        params object[] args)
    {
        if (Logger._logLock.WaitOne(250))
        {
            try
            {
                using (StreamWriter sw = new StreamWriter(Logger._activityLogPath, true))
                {
                    if (logType != "RAW")
                    {
                        sw.Write("{0} {1} {2} ",
                            DateTime.Now,
                            logType,
                            severity);
                    }

                    sw.WriteLine(format, args);
                }
            }
            finally
            {
                Logger._logLock.ReleaseMutex();
            }
        }
    }

困扰我的是“使用”块,它将从同一个文件创建一个流,每次记录某些内容(每秒多次调用)。我知道文件缓存所以我不完全确定重新安装流是一个太大的问题(不必要的流缓冲初始化?)。我正在考虑将StreamWriter作为变量添加到Logger类中,但我还想确保在单元不正确地关闭时正确关闭或刷新写入器。众所周知,最终用户只关闭了设备。我正试图找到安全和速度之间的平衡,并且只是希望获得一些洞察力。感谢。

2 个答案:

答案 0 :(得分:1)

a)是的,每次创建一个流都不是很有效。例如,您可能会考虑在某种集合中收集消息,并在固定的时间间隔内写入/附加此集合,可能是从另一个线程到文件......这样您就不需要等待250ms了可以附加到集合,线程将使用集合的内容。您还应该保持流打开 - 如果其他应用程序锁定文件,您执行此操作的方式可能会失败...如果在写入硬件关闭后刷新,则不应影响日志文件的内容。

b)有许多测试框架经过良好测试,灵活且具有出色的性能......为什么要重新发明轮子?

答案 1 :(得分:0)

  

如果设备硬件关闭不正确,我还要确保编写器正确关闭或刷新。

如果用户在未刷新流的情况下关闭设备,则无法正常关闭,无论您是否使用usingusing的关键时间跨度可能会缩短并且无需手动冲洗。)

不是每次都创建一个新的StreamWriter,而是创建一次并在写完后刷新它。但请注意,如果您想100%确定,则需要某种硬件(读取:缓冲电池,UPS)。