C# 快速写入日志 不卡线程 生产者 消费者模式

有这样一种场景需求,就是某个方法,对耗时要求很高,但是又要记录日志到数据库便于分析,由于访问数据库基本都要几十毫秒,可在方法里写入BlockingCollection,由另外的线程写入数据库。

可以看到,在我的机子上面,1ms写入了43条日志。

csharp 复制代码
BlockingCollection<LogModel> logQuenen = new BlockingCollection<LogModel>(1000);
        private void button2_Click(object sender, EventArgs e)
        {
            Task.Run(() => 
            {
                for (int i = 0; i < 100; i++)
                {
                    LogModel logModel = new LogModel();
                    logModel.Log=Guid.NewGuid().ToString();
                    logModel.Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
                    logQuenen.Add(logModel);
                }
            });
            Task.Run(() =>
            {
                while (true) 
                {
                    var logModel= logQuenen.Take();
                    string sql = $@"INSERT INTO LogTest
(
  TextC
 ,TimeC
)
VALUES
(
  '{logModel.Log}' -- TextC - VARCHAR(255)
 ,'{logModel.Time}' -- TimeC - TIMESTAMP(3)
);";
                    Function.MySQLHelper.ExecuteNonQuery(sql);
                }
            });
            MessageBox.Show("已点击!!!!!");
        }
        public class LogModel
        { 
            public string Log { set;get; }
            public string Time { set;get; }
        }
相关推荐
无小道11 小时前
Redis——哨兵
数据库·redis·缓存·哨兵
长明11 小时前
C#项目组织与概念梳理
后端·c#
爱奥尼欧12 小时前
轻量级可扩展日志框架-异步日志与系统集成
开发语言·数据库·c++·学习
迷路爸爸18012 小时前
Python collections 入门+实战
windows·python·c#·collections·dict
爱奥尼欧12 小时前
轻量级可扩展日志框架-日志落地与日志器模块实现
jvm·数据库·c++
csdn_aspnet12 小时前
C# 截取或匹配字符串内包含指定字符的一些方法
c#·字符串·分割·string·匹配·截取
ycydynq12 小时前
Django利用中间间 判断页面是否登录,未登录则返回登录页
数据库·django·sqlite
Rotion_深12 小时前
C# 值类型与引用类型 详解
开发语言·jvm·c#
承渊政道12 小时前
【MySQL数据库学习】(MySQL访问、连接池原理与简易网站数据流动)
数据库·学习·mysql·mysql访问·连接池原理
吴声子夜歌12 小时前
SQL进阶——EXISTS谓词
java·数据库·sql