如果在整个应用程序生命周期中需要它,可以在哪里部署StreamWriter?

时间:2012-05-24 15:54:34

标签: c#

如果在整个应用程序生命周期内需要StreamWriter,请在哪里部署?我要把它丢弃在析构函数中,那会有用吗?我必须处理刷新数据,我不想使用AutoFlush功能,因为来自msdn:"You can get better performance by setting AutoFlush to false, assuming that you always call Close (or at least Flush) when you're done writing with a StreamWriter."

我应该在析构函数中使用Dispose,如下面的代码所示?

class Log
{
    private static StreamWriter swLog = new StreamWriter("logMAIN.txt");

    static ~Log()
    {
        swLog.Dispose();
    }

    public static void Push(LogItemType type, string message)
    {
        swLog.WriteLine(type + " " + DateTime.Now.TimeOfDay + " " + message);
    }
}

更新而不是Dispose我打算调用Close,但在这种情况下它并不重要,因为它们看起来完全一样。

2 个答案:

答案 0 :(得分:2)

您似乎基于决定不从MSDN中获取某些性能信息。那不是我开始的地方。

您是否有证据使用AutoFlush导致重大性能问题?

您是否考虑过以不同方式缓解这些性能问题,例如:有一个线程写入StreamWriter,是自动刷新还是每20秒或每隔一段时间定期刷新一次?

您还没有告诉我们您正在编写什么样的应用程序,请注意,这对于您对关闭的了解程度会产生重大影响。

另请注意,您提供的代码在开始时不是线程安全的。您最终可能会同时使用多个线程中的StreamWriter;我怀疑StreamWriter是专门针对那种情况设计的。

答案 1 :(得分:0)

问题实际上是StreamWriter初始化的方式。使用像这样的常规对象

using (var logger = new Log())
{
    app.Run();
}

StreamWriter仍然可以是Log类中的静态字段,但是会在已知时间点进行初始化和处理,而不是使用静态初始值设定项。

为此,您需要让您记录类实现IDisposable接口,并将StreamWriter处理为Dispose方法,如下所示:

class Log: IDisposable
{
    private static StreamWriter swLog;

    public Log()
    {
       swLog = new StreamWriter("logMAIN.txt");
    }

    public void Dispose()
    {
        swLog.Dispose();
    }

    public static void Push(LogItemType type, string message)
    {
        swLog.WriteLine(type + " " + DateTime.Now.TimeOfDay + " " + message);
    }
}

另请注意即使抛出异常,Log将如何处理。