架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 20300|回复: 2

[资料] .NET/C# 基于 BlockingCollection 实现简单日志记录

[复制链接]
发表于 2021-1-5 14:58:50 | 显示全部楼层 |阅读模式
之前写过一个简单日志记录的帮助类,从别的框架上面复制下来的,测试并不好用,如下:

c# 最简单的写log日志方法
https://www.itsvse.com/thread-5111-1-1.html
本文基于 BlockingCollection 重新实现一个简单写日志的类。

.net/c# 线程安全集合(整理)
https://www.itsvse.com/thread-3769-1-1.html
BlockingCollection<T> 是一个线程安全集合类,可提供以下功能:

实现制造者-使用者模式。
通过多线程并发添加和获取项。
可选最大容量。
集合为空或已满时通过插入和移除操作进行阻塞。
插入和移除“尝试”操作不发生阻塞,或在指定时间段内发生阻塞。
封装实现 IProducerConsumerCollection<T> 的任何集合类型
使用取消标记执行取消操作。
支持使用 foreach(在 Visual Basic 中,使用 For Each)的两种枚举:只读枚举。在枚举项时将项移除的枚举。


微软介绍:https://docs.microsoft.com/zh-cn/dotnet/standard/collections/thread-safe/blockingcollection-overview

BlockingCollection 就是一个线程安全的阻塞队列,利用阻塞这个特性,我们可以实现进程内的生产者-消费者模式,比如消息转发、日志记录等。

调用其 Add 方法,将信息添加到队列,当队列没有消息的时候,IsCompleted 会一直阻塞 while 循环,所以,并不会导致死循环。等有新的消息出来的时候,while 里面的 IsCompleted 将会被激发,返回 bool 类型,导致继续执行,也就是线程里面取数据。


之前我们通过调用 ManualResetEvent 的 WaitOne 方法来阻塞线程,调用 Reset 和 Set 方法来传递信号,如下:

c# 封装了一个万能QueueHelper队列
https://www.itsvse.com/thread-5029-1-1.html


测试写1万条日志,耗时不到10毫秒,如下图:

微信截图_20210105145252.png

代码如下:

源码下载:

游客,如果您要查看本帖隐藏内容请回复





上一篇:warning: LF will be replaced by CRLF in xxxx.
下一篇:Entity Framework 查询优化之 WITH(NOLOCK)
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2021-1-23 11:53:55 | 显示全部楼层
.NET/C# 基于 BlockingCollection 后台任务队列
https://www.itsvse.com/thread-9528-1-1.html

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2023-4-24 22:36:31 | 显示全部楼层
非常棒,非常好的学习材料
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-6-16 15:31

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表