2

如果我在整个应用程序生命周期中需要 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);
    }
}

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

4

2 回答 2

2

您似乎是根据 MSDN 中的某些性能信息决定不刷新。那不是我要开始的地方。

您是否有证据表明使用 AutoFlush 会导致严重的性能问题?

您是否考虑过以不同的方式缓解这些性能问题,例如让单个线程写入StreamWriter,自动刷新或每 20 秒定期刷新或其他方式?

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

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

于 2012-05-24T16:00:25.717 回答
0

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

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

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

为此,您需要让日志类实现IDisposable接口并StreamWriterDispose方法中处理,如下所示:

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即使抛出异常也将如何处理。

于 2012-05-24T15:59:24.990 回答