C# C语言中的快速打开和关闭System.IO.StreamWriter#

C# C语言中的快速打开和关闭System.IO.StreamWriter#,c#,io,streamwriter,C#,Io,Streamwriter,假设您有一个文件,您正在以编程方式将有关进程的信息记录到该文件中。有点像典型的debug Console.WriteLine,但由于测试代码的性质,您没有控制台可供写入,因此必须将其像文件一样写入某个地方。我当前的程序使用System.IO.StreamWriter执行此任务 我的问题是关于使用StreamWriter的方法。是否最好只打开一个StreamWriter实例,执行所有写入操作,并在整个过程完成后关闭它?还是打开一个新的StreamWriter实例将一行写入文件,然后立即关闭它,并在

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


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

看看预卷日志实现;它们可以帮你省去很多头疼的事。显然,保持流开放意味着如果它崩溃,您可能会丢失一些最终数据,但可能会通过缓冲更多IO来提高性能。一些实现还可能提供诸如来自后台处理程序/队列的异步日志记录等功能。

对于每次写入,重复打开/关闭一个新的StreamWriter将为GC生成大量资源,并且由于每次打开操作的实际文件查找,会给应用程序带来额外的开销。另一方面,保持单个流处于打开状态将保持对文件的锁定。这要看情况而定

您不希望日志记录机制成为性能瓶颈,所以请写入单个流。对于关键调试,将其设为无缓冲或自动刷新(但请注意,这也会影响性能)


我将遵循log4net的模型,创建一个静态日志流,并写入该单例。不管怎样,请查看log4net,这样您就不会使用自己的日志了

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

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


HTH.

看看重定向标准输出(例如控制台设置)。我认为,如果您使用日志来调试这样的崩溃,而不是为用户记录,那么丢失应用程序崩溃的数据可能是至关重要的。在后一种情况下,缓冲解决方案肯定更好,特别是因为您的解决方案不会一直锁定文件,所以它是+1。@如果调试崩溃,我将设置阈值,以便为队列中的每1-2个条目写入文件。在正常的应用程序运行中,我可能会将其设置为每100个条目写入一次。我不认为在调试时应用程序的性能是一个关键因素,但在实时运行时它很重要。@Sunny:如果我看一下我公司的大型桌面应用程序,日志记录,即使是立即记录,也与性能无关(是的,我分析了(;)。操作系统也会缓存写数据,除非系统崩溃,否则我至少会收到所有错误消息,包括第一次崩溃时的堆栈跟踪。我们的崩溃很难重现(主要取决于外部因素),这在很多情况下都非常有用。不过,我理解你的观点,特别是如果你记录了很多事情。我想这是纯错误日志和一般日志之间的区别。@OregonGhost@Sunny对于这种特殊情况,一般日志只会在开发和测试阶段进行。对于实际部署我们将使用纯错误日志。不知道这些信息会对您的答案产生多大影响。@ccornet:在这种情况下,我认为您应该立即写:在开发/调试期间,正如Sunny已经说过的,性能并不重要(它将帮助调试崩溃等),如果您只想在实时生成中记录错误,最好不要错过一个错误,因为对性能的影响可以忽略不计。@Marc:缓冲应该是一个单独的问题。打开的流可以是自动刷新(或潜在的无缓冲)流。我猜System.Console.error使用自动刷新,因为这是“斯特德"处理。@Marc不要偷懒,但是你有没有关于特别好的日志记录解决方案的非顶级建议?我已经看过@mrjoltcola的建议,但我认为分散研究总是好的。为此,即使我会自己做更多的研究,如果你有任何直接的建议要研究的话,这会很方便。OregonGhost的评论实际上解决了我的问题。但这不是一个答案…所以我不能接受。这个答案,对于这个问题更一般的性质,明确解释了方法的不同,所以我接受这个答案。