假设您有一个文件,您以编程方式将信息记录到进程中。有点像你典型的调试Console.WriteLine,但由于你正在测试的代码的性质,你没有一个控制台可以写入,所以你必须像文件一样写它。我当前的程序使用System.IO.StreamWriter执行此任务。
我的问题是关于使用StreamWriter的方法。打开一个StreamWriter实例,执行所有写操作并在整个过程完成后关闭它是否更好?或者更好的想法是打开一个新的StreamWriter实例来在文件中写入一行,然后立即将其关闭,并在每次需要写入内容时执行此操作?在后一种方法中,这可能会通过一种方法来促进,该方法可以对给定的消息执行此操作,而不是使用过多的行来膨胀主进程代码。但是,有一种方法来帮助实现并不一定使它成为更好的选择。选择一种方法还是另一种方法有明显的优势吗?或者它们在功能上是否相同,将选择留在程序员的肩膀上?
答案 0 :(得分:4)
查看预先滚动的日志记录实现;他们可以为你节省很多麻烦。显然保持流打开意味着如果崩溃可能会丢失一些最终数据,但可能会因缓冲IO而导致性能下降。某些实现还可能提供诸如从假脱机程序/队列进行异步日志记录之类的功能。
答案 1 :(得分:1)
为每次写入重复打开/关闭新的StreamWriter将为GC生成大量资源,并且由于每次打开操作实际查找文件,因此会对应用程序施加开销。另一方面,保持单个流打开将锁定文件。所以这取决于。
您不希望您的日志记录机制成为性能瓶颈,因此请写入单个流。使其无缓冲或AutoFlush进行关键调试(但请注意,这也会对性能产生影响)。
我将遵循log4net的模型,创建一个静态日志流,并写入该单例。无论如何看看log4net,所以你不要自己动手。 http://logging.apache.org/log4net/index.html
答案 2 :(得分:1)
我会缓冲/排队数据&一旦达到阈值,就写出文件。当应用程序正常关闭/退出时刷新整个队列。
唯一的问题是,如果应用程序崩溃,您可能会丢失队列中的项目......
HTH。