如果在整个应用程序生命周期内需要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
,但在这种情况下它并不重要,因为它们看起来完全一样。
答案 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
将如何处理。