繁体   English   中英

在C#中快速打开和关闭System.IO.StreamWriter

[英]Rapid Opening and Closing System.IO.StreamWriter in C#

假设您有一个文件,您以编程方式将信息记录到进程中。 有点像你典型的调试Console.WriteLine,但由于你正在测试的代码的性质,你没有一个控制台可以写入,所以你必须像文件一样写它。 我当前的程序使用System.IO.StreamWriter执行此任务。

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

查看预先滚动的日志记录实现; 他们可以为你节省很多麻烦。 显然保持流打开意味着如果崩溃可能会丢失一些最终数据,但可能会因缓冲IO而导致性能下降。 某些实现还可以提供诸如来自假脱机程序/队列的异步日志记录之类的功能。

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

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

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

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

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

HTH。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM