WPF MaterialDesign 示例开源项目介绍


当前第2页 返回上一页

首先,从整体架构下手:
- 旧组件特点:
* 使用多线程队列,用互斥变量控制线程对文本的写入。
* 通过单例加锁的方式,控制资源的争夺
* 线程是随机被选中入锁的,写入的日志时间顺序可能不对
* 一个线程一次文本操作,开关都在一个线程操作,一次只写入一条变量
- 优点:
* 多线程操作,表面提高操作效率
  * 单例加锁,确保唯一
- 缺点:
* 性能底下,过度操作io导致性能严重冗余
* 一次只写一条
- 改进
* 使用生产者消费者模式,分开操作,限制线程数量
* 使用栈队列,先进先出,保证日志顺序
* 单例IO变量,批量进行写入操作
改造成果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

using System;using System.Collections;using System.IO;using System.Text;using System.Threading;using System.Windows.Threading;namespace Helper

{public static class LogHelper

    {private static readonly Queue LogQueue = new Queue();private static bool _isStreamClose = true;private static bool _isThreadBegin = false;private static StreamWriter _fileStreamWriter;private static readonly string fileName =@"BugLog.txt";static int _intervalTime = 10000;// 10sstatic System.Timers.Timer _timer = new System.Timers.Timer(_intervalTime);/// <summary>/// 添加日志队列/// </summary>/// <param name="message"></param>public static void AddLog(string message)

        {string logContent = $"[{DateTime.Now:yyyy-MM-dd hh:mm:ss}] =>{message}";

            LogQueue.Enqueue(logContent);if (!_isThreadBegin)

            {

                BeginThread();

            }

        }public static void AddLog(Exception ex)

        {var logContent = $"[{DateTime.Now:yyyy-MM-dd hh:mm:ss}]错误发生在:{ex.Source},\r\n 内容:{ex.Message}";

            logContent += $"\r\n  跟踪:{ex.StackTrace}";

            LogQueue.Enqueue(logContent);if (!_isThreadBegin)

            {

                BeginThread();

            }

        }/// <summary>/// 读取日志队列的一条数据/// </summary>/// <returns></returns>private static object GetLog()

        {return LogQueue.Dequeue();

        }/// <summary>/// 开启定时查询线程/// </summary>public static void BeginThread()

        {

            _isThreadBegin = true;//实例化Timer类,设置间隔时间为10000毫秒;     _timer.Interval = _intervalTime;

 

            _timer.Elapsed += SetLog;//到达时间的时候执行事件;   _timer.AutoReset = true;//设置是执行一次(false)还是一直执行(true);     _timer.Enabled = true;

        }/// <summary>/// 写入日志/// </summary>private static void SetLog(object source, System.Timers.ElapsedEventArgs e)

        {if (LogQueue.Count == 0)

            {if (_isStreamClose) return;

                _fileStreamWriter.Flush();

                _fileStreamWriter.Close();

                _isStreamClose = true;return;

            }if (_isStreamClose)

            {

                Isexist();string errLogFilePath = Environment.CurrentDirectory + @"\Log\" + fileName.Trim();if (!File.Exists(errLogFilePath))

                {

                    FileStream fs1 = new FileStream(errLogFilePath, FileMode.Create, FileAccess.Write);

                    _fileStreamWriter = new StreamWriter(fs1);

                }else{

                    _fileStreamWriter = new StreamWriter(errLogFilePath, true);

                }

                _isStreamClose = false;

            }var strLog = new StringBuilder();var onceTime = 50;var lineNum = LogQueue.Count > onceTime ? onceTime : LogQueue.Count;for (var i = 0; i < lineNum; i++)

            {

                strLog.AppendLine(GetLog().ToString());

            }

 

            _fileStreamWriter.WriteLine(strLog.ToString());

 

        }/// <summary>/// 判断是否存在日志文件/// </summary>private static void Isexist()

        {string path = Environment.CurrentDirectory + @"\Log\";if (!File.Exists(path))

            {

                Directory.CreateDirectory(path);

            }

        }

    }

}

代码没有第三方组件的应用,直接把这个文件复制即可使用。

现在暂时没有对一些特殊情况做处理,例如日志文件被占用、软件临时关闭,以及队列触发时间和批量写入个数等考虑,这只是一个最基础的demo,

当然,如果你想知道后续的改进方法,可以关注该项目的GitHub 。

当然,期待你们更好的建议,大家一起学习,你有好的想法,自己又不想写,我来帮你实现!

以上就是WPF MaterialDesign 示例开源项目介绍的详细内容!

返回前面的内容

相关阅读 >>

全开源asp.net工作流平台的详细介绍

wpf materialdesign 示例开源项目介绍

详解三种二维码的开源工具的不同之处

详细介绍一个.net开源权限管理系统

分享一些平时收藏和应用的开源代码

如何将vs2013的项目在vs2010中打开(visual studio降级打开项目)

最新开源dblayer的详细介绍

更多相关阅读请进入《Manager》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...