4

假设您有一个文件,您正在以编程方式将有关进程的信息记录到其中。有点像典型的调试 Console.WriteLine,但是由于您正在测试的代码的性质,您没有控制台可以写入,因此您必须将其写入文件之类的地方。我当前的程序使用 System.IO.StreamWriter 来完成这项任务。

我的问题是关于使用 StreamWriter 的方法。只打开一个 StreamWriter 实例,完成所有写入,并在整个过程完成后关闭它会更好吗?还是打开一个新的 StreamWriter 实例以在文件中写入一行,然后立即关闭它,并在每次需要写入内容时执行此操作是一个更好的主意?在后一种方法中,这可能会通过对给定消息执行此操作的方法来促进,而不是用过多的行使主进程代码膨胀。但是有一种方法来帮助实现这一点并不一定会让它成为更好的选择。选择一种方法或另一种方法有显着优势吗?还是它们在功能上是等价的,把选择权留给了程序员?

4

3 回答 3

4

查看预滚动的日志记录实现;它们可能会为您省去很多麻烦。显然,保持流打开意味着如果它崩溃,您可能会丢失一些最终数据,但可能会通过缓冲 IO 获得更多性能。一些实现还可能提供诸如来自假脱机程序/队列的异步日志记录等功能。

于 2010-04-22T15:38:22.017 回答
1

为每次写入重复打开/关闭一个新的 StreamWriter 将为 GC 生成大量资源,并且由于每次打开操作都会实际查找文件而给应用程序带来开销。另一方面,保持打开单个流将锁定文件。所以这取决于。

您不希望您的日志记录机制成为性能瓶颈,因此请写入单个流。使其无缓冲或 AutoFlush 用于关键调试(但请注意,这也会影响性能)。

我会遵循 log4net 的模型,创建一个静态日志流,然后写入该单例。无论如何都要查看 log4net,所以你不要自己动手。http://logging.apache.org/log4net/index.html

于 2010-04-22T15:39:41.140 回答
1

一旦达到阈值,我将缓冲/排队数据并写入文件并在应用程序正常关闭/退出时刷新整个队列。

唯一的问题是在应用程序崩溃的情况下,您可能会丢失队列中的项目......

HTH。

于 2010-04-22T15:41:30.870 回答