在开发应用程序时,日志记录是一个重要的环节,它帮助开发者追踪程序的执行过程,同时也为用户诊断问题提供了依据。然而,当应用程序执行长时间运行的任务时,如何有效地将日志信息展示给用户,是一个值得思考的问题。本文将介绍一种高效的日志查看器设计方法,旨在提高应用程序的用户体验和性能。
当应用程序执行一个需要花费数分钟的任务,并执行成千上万的步骤时,如果用户界面(GUI)在此期间没有变化,用户可能会认为应用程序已经冻结。另一方面,用户可能不需要看到所有的步骤,只需要看到几个主要步骤和当前步骤。最简单的方法是只显示主要步骤,但这样用户就无法知道哪个详细的步骤花费了太多时间。但如果用户看到当前步骤显示了几秒钟,他们就知道出了问题。
设计日志查看器时,需要考虑以下几个方面:
在实现多线程时,考虑使用一些复杂的多线程安全集合来存储消息,但最终决定只使用简单的列表,并锁定后台任务的每个Write()和WPF线程的每个Read()。如后所述,Read()非常快,每秒只执行10次,这意味着几乎不会有任何同时锁定。
后台任务通常属于业务层代码,不应该依赖于WPF。因此,LogViewer定义了自己的StringStyleEnum:
public enum StringStyleEnum {
none = 0,
normal,
label,
header1,
errorHeader,
errorText,
stats
}
这些值可以根据应用程序的需要有所不同。文件StyledString.cs还包含静态方法StyledString.ToInline(),它将消息及其StringStyleEnum值转换为WPF flowdocument Run。
可以从GitHub获取LogViewer的最新版本: 把它放在自己的DLL LogViewerLib中。与其将该库链接到应用程序中,建议只复制两个文件,LogViewer.cs和StyledString.cs。需要根据应用程序的需要更改StyledString.cs的内容,因此,如果不与GitHub上的LogViewer同步代码,可能会更好。
LogViewerTestApp是用来测试LogViewer的WPF应用程序。运行LogViewerTestApp可以让了解LogViewer的行为。
如果读到这里,可能真的对WPF感兴趣,在这种情况下,会热情推荐一些其他WPF文章。这篇文章觉得读起来没那么有趣,但一些文章真的很有帮助,给提供了在其他地方找不到的WPF见解:
还写了几个开源项目在GitHub上: