对于长时间运行的后台任务,用户了解当前执行的步骤很有帮助。LogViewer可以安全地多线程收集此信息,并将其显示为可滚动文本。LogViewer允许后台线程在不使用任何WPF代码的情况下写入格式化文本。当每秒需要写入数百条消息时,WPF更新每条消息的GUI的速度太慢。LogViewer收集消息,并每秒将它们发送到WPF线程10次。

日志查看器用例

在后台执行任务是很常见的,该任务可能会运行几分钟并执行数千个步骤。如果GUI在此期间未显示任何更改,则用户可能会认为应用已冻结。另一方面,他可能不需要看到所有数千步,而只需要看到几个主要的和当前的台阶。

最简单的方法是显示主要步骤,但是用户不知道许多细节步骤中的哪一个花费了太多时间。但是,如果他看到当前步骤显示几秒钟,他就知道出了问题。

由于后台任务可能不知道哪个步骤需要很长时间并显示出来,因此最简单的方法是将所有消息写入LogViewer,然后执行以下函数:

  • 接受多线程安全的日志记录消息,而不是在WPF线程上
  • 区分临时消息和永久消息。临时消息将被任何后续消息覆盖,而后台任务完成后仍向用户显示永久消息。
  • 收集0.1秒内收到的所有消息,并将它们一起传输到WPF线程。WPF线程每秒无法更新GUI数百次,并且用户无论如何都无法读取信息。
  • 将消息转换为WPF Flow<wbr />Document元素。控制字体、大小、边距等可能相当复杂,后台任务的编写者不需要知道WPF。为了指定所需的格式,他只需随消息一起传递一个专门为 StyledString .cs 中的应用定义的StringStyleEnum值。

日志查看器设计

本章介绍一些设计注意事项。如果您只是对使用日志查看器感兴趣,请跳转到在应用中使用LogViewer 一章。

多线程的实现

我正在考虑使用一些花哨的多线程安全集合来存储消息,但最终,我决定只使用简单的列表,并通过后台任务锁定每个Write()和WPF线程的每个Read()。很快解释一下,Read()非常快,每秒只执行10次,这意味着几乎不会有任何同时锁定。

LogViewer.Write()获取锁,然后使用“活动”消息缓冲区执行三个活动:

  1. 如果缓冲区中的最后一条消息是临时消息,请将其删除。
  2. 将消息与StringStyleEnum值一起添加到活动缓冲区
  3. 如果未启动计时器:启动计时器延迟0.1秒,如果调用方实际上已在WPF线程上运行,请立即将消息写入GUI。

在wpfTimer的Tick事件中,首先锁定缓冲区,然后切换缓冲区。如果在tick发生之前Write()使用Buffer1,它将在之后使用Buffer2。锁现在被释放,WPF线程具有处理“非活动”缓冲区所需的所有时间。完成后,计时器将在另外0.1秒内自行重新启动。一旦它获得空缓冲区,它就会停止重新启动。

支持格式化文本

后台任务通常属于业务层代码,该代码不应与WPF有任何依赖关系。出于这个原因,LogViewer定义自己的StringStyleEnum:

public enum StringStyleEnum {none = 0,normal,label,header1,errorHeader,errorText,stats
}

根据应用程序的需要,这些值可以不同。文件StyledString.cs还包含static方法StyledString.ToInline(),该方法将消息及其StringStyleEnum值转换为WPF流文档Run:

case StringStyleEnum.header1:styledParagraph.Margin = new Thickness(0, 24, 0, 4);inline = new Bold(new Run(message)) {FontSize = styledParagraph.FontSize * 1.2};break;

向纯字符串添加格式

后台任务使用以下LogViewer方法进行写入:

public void WriteLine()
public void WriteLine(string line)
public void WriteTempLine(string line)
public void WriteLine(string line, StringStyleEnum stringStyle)
public void WriteTempLine(string line, StringStyleEnum stringStyle)
public void Write(string text)
public void Write(string text, StringStyleEnum stringStyle)
public void Write(StyledString styledString)
public void Write(params StyledString[] styledStrings)

Write()包含消息和有关格式的一些信息,以及是否需要行尾。LogViewer将其转换为StyledString,然后将其转发到WPF。

public class StyledString {public string String { get; private set; }public StringStyleEnum StringStyle { get; private set; }public LineHandlingEnum LineHandling { get; private set; }public DateTime Created { get; private set; }
}

每个应用程序的StringStyleEnum值都不同。LineHandling可以具有三个值none,endOfLine和temporaryEOL。基本上,可以使用Write()只写入一行的一部分,如果日志行的一部分应该加粗而另一部分应该加粗,这很有用,在这种情况下,后台任务将调用两次Write()。

标记为temporaryEOL的消息只显示给用户,直到调用下一个Write()。

在您的应用程序中使用日志查看器

您可以从Github获取LogViewer最新版本:

GitHub - PeterHuberSg/LogViewer: WPF control showing formated text scrolling line by line

我把它放在它自己的DLL LogViewerLib中。与其将该库链接到您的应用程序中,我建议只复制两个文件,LogViewer.csStyledString.cs。您需要根据应用的需求更改StyledString.cs的内容。因此,如果您不继续在GitHub上同步LogViewer代码,可能会更好。

LogViewerTestApp是我用来测试LogViewer的WPF应用程序。

测试日志查看器

查看LogViewerTestApp代码以了解如何添加LogViewer到应用中可能会很有趣。运行LogViewerTest会让你感受到AppLogViewer的行为方式。

Test1写入一些不同格式的文本。请注意,最后一行“tempLine3”是临时行。一旦再次按下任何TestX按钮,该行就会被覆盖。

Test2尽快写入临时行。令人惊讶的是,LogViewer每秒可以处理一百万条临时消息!毕竟,它只是在RAM中收集它们,但每0.1秒只向WPF发送1个。

Test3不断写新行。这有助于测试用户是否可以停止并继续自动滚动。如果用户想要检查永久行,他可以滚动到该行,这会停止自动滚动。一旦他想再次激活自动滚动,他只需滚动到最后。

延伸阅读

如果你读到这里,你可能真的对WPF感兴趣,在这种情况下,我会热烈推荐我的其他一些WPF文章。我觉得现在的文章读起来不是那么有趣,但我的一些文章真的很有帮助,让你深入了解WPF,这是你在其他任何地方都找不到的:

  • 深入了解WPF布局和呈现
  • WPF开发人员必读:WPF控制测试台
  • 使用绑定设置WPF DataGrid格式指南
  • WPF DataGrid:解决排序、ScrollIntoView、刷新和焦点问题
  • 避免WPF DataGrid限制,将其替换为你自己的几行代码
  • WPF线性渐变画笔参数揭秘
  • 提高WPF调度程序计时器精度

我在Github上的项目

我还在Github上写了几个开源项目:

存储库

真正惊人的单用户WPF应用程序的数据库替换。程序员只需定义他要使用的C#类,代码生成器将用于在本地磁盘上永久创建、更新和删除数据的所有代码写入所有代码。这大大加快了开发人员的工作速度,因为他不再需要使用任何SQL,实体框架等。查询在Linq中完成,运行速度超快。代码的执行速度比任何数据库都快得多。支持事务、备份等。自5+年以来在多个项目中无错误运行。

TracerLib

实时高效地收集多线程数据,这些数据可以存储在文件中,也可以存储在RAM中并在一段时间后丢弃。这对于异常处理很有用,因为这允许告诉用户在异常发生之前(!)发生了什么。

WpfWindowsLib

用于数据输入的WPF控件,检测是否缺少所需数据或数据是否已更改。

https://www.codeproject.com/Articles/5340961/LogViewer-A-Fast-WPF-Control-Displaying-Logging-In

日志查看器:显示日志记录信息的快速WPF控件相关推荐

  1. 系统安全运维 Server 2008 R2 事件查看器实现日志分析

    <系统安全运维>  Server 2008 R2 事件查看器实现日志分析 在 windows server 2008 R2 中,可以通过点击 "开始" -> &q ...

  2. Android 日志自动分析,Android Log Viewer:一个日志查看器工具,可简化实时对Android日志的分析...

    作为与Cordova一起工作的移动应用程序开发人员, 我知道调试应用程序的本机部分会很困难, 例如, 当你为应用程序创建本机插件时(在这种情况下, Android Studio无效).在试图找出我的应 ...

  3. 微软云服务器路由跟踪,使用路由日志查看器

    使用路由日志查看器 05/13/2016 本文内容 适用于: Exchange Server 2010 SP2, Exchange Server 2010 SP3 上一次修改主题: 2012-07-2 ...

  4. SharePoint ULS Log Viewer 日志查看器

    SharePoint ULS Log Viewer 日志查看器 项目描述 这是一个Windows应用程序,更加轻松方便查看SharePoint ULS日志文件.支持筛选和简单的视图. 信息 这是一个W ...

  5. Java Log Viewer日志查看器

    工欲善其事必先利其器 在投奔怒海--一个Domino老程序员眼里的Java开发我提到目前所做的Java开发中遇到的大量日志之问题.服务器控制台刷屏似地滚动,日志文件飞快地增长,debug的时候相关信息 ...

  6. Moon转告给你一个比Log4net更好日志框架--TracerX Logger 及其对应的日志查看器

    一.介绍 TracerX logger是一个易于上手,且拥有众多高级特性的.NET日志框架. 它能够发送输出结果到多目的地(循环文件.事件日志等....).它也能生成文本和二进制文件. 它拥有一个强大 ...

  7. 事件查看器window日志_查看系统日志时修复“事件查看器无法打开事件日志”

    事件查看器window日志 As any geek knows, one of the first things that you do when troubleshooting a Windows ...

  8. java日志——修改日志管理器配置+日志本地化

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java日志--修改日志管理器配置+日志本地化 的相关知识: [1]修改日志管理器配置 1.1 ...

  9. linux查看后10000行的日志,查看线上日志常用命令

    cat 命令(文本输出命令) 通常查找出错误日志 cat error.log | grep 'nick' , 这时候我们要输出当前这个日志的前后几行: 显示file文件里匹配nick那行以及上下5行 ...

最新文章

  1. 在Visual Studio Code里进行Java开发
  2. jsf服务_使用JSF的面向服务的UI
  3. 如何解决90%的问题?10位阿里大牛公布方法
  4. java 乱码 号处理器_java处理中日文字符串的乱码问题
  5. Linux学习私人笔记-Vim
  6. 每日一句20191019
  7. mysql导入.sql文件
  8. [19保研]厦门大学软件学院暑期夏令营招生简章
  9. 谷歌gmail注册入口_Gmail样式的侧面板即将用于Google文档和Google日历
  10. pandas算加权平均值_pandas和groupby:如何计算agg中的加权平均值
  11. 不定时更新-JAVA干货博客
  12. php im即时消息,im即时通讯php
  13. 论文中常用的对word页眉页脚的操作
  14. 街道字符识别赛题理解
  15. 大数据分析的好帮手 Excel函数应用的顶级实战 Excel数据分析应用+VBA实战 24G课程
  16. linux设置mysql防火墙端口映射_Linux防火墙默认是关闭3306端口,iptables实现端口转发、端口映射及双向通路...
  17. 盘点2019年经典营销案例
  18. 基于ETH创建自己的代币
  19. 五种3DMAX使用版本区别比较(一)
  20. jmeter--参数化--详解

热门文章

  1. windows 远程连接debian_Linux远程桌面连接Windows
  2. chromium 50 chromium57 版本编译启用 widevine 功能
  3. php轮播效果代码,CSS实现轮播图效果(附代码)
  4. Retrofit2-源码解析,kotlin协程android
  5. cadance学习笔记(1)---常用器件,更改图纸尺寸
  6. 【MicroPython esp8266】固件烧写教程
  7. IntelliJ IDEA 2020.3正式发布,真香
  8. linux设置网络ip自启动,【CentOS7配置】如何设置:启动后自动获取网络连接、配置固定IP...
  9. 指针式仪表自动读数与识别(八):仪表自动读数系统设计与开发
  10. 水雨情自动监测系统-大坝安全监测-智慧水库