写入日志时并发及加锁的思考

本文探讨了在项目中遇到的日志记录并发问题,并提出了两种解决方案:一是通过加锁方式解决读写冲突;二是利用消息队列技术提高性能,减少用户等待时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在简单的项目架构搭建中经常会考虑日志记录的问题,这难免也不可避免许多附带问题的产生。最近我也遇到了相同的事,问题大概有以下两点:

1.并发处理

2.如果使用加锁的方式,如何处理性能上的问题

先展示第一种方式,我直接用加锁的方式来处理,这样就可避免在多个用户同时需要写入一个相同日志文件时产生的读写冲突

  lock ("ExceptionLog")
            {
                File.AppendAllText(@"C:\Users\Think\Desktop\log.txt", msg + "\r\n+------------------\r\n");
            }

这样能有效的解决之前所提的并发产生的读写冲突,但这样也就会因此衍生一个新的问题。加锁之后万一读取过程出现了错误,这样会延长其他用户等待写入的时间,性能上也就会跟着受影响了。

庆幸的是微软提供我们一个消息队列的概念,能较好的解决用户等待的问题。做法其实也不难,把所有的错误信息都放到内存中去,再从内存中拿信息。这是一个很简单并且有效的解决方案,突然想到当时面试时有一次问我怎么处理消息推送时网络中断的问题了,当时回答的加锁确实不是最有效的办法。看以下代码:

public static void WriteLog()
        {

            
            //解决让用户等待的问题
            ThreadPool.QueueUserWorkItem(s =>
            {
                while (true)
                {
                    if (ErrorQueue.Count > 0)
                    {
                        //从队列里去读取信息
                        string msg = ErrorQueue.Dequeue();
                        File.AppendAllText(@"C:\Users\Think\Desktop\log.txt", msg + "\r\n+------------------\r\n");                       
                    }
                    Thread.Sleep(1000);//1秒读一次
                }
            });
           
        }
        /// <summary>
        /// 把错误信息加到内存,再从内存拿信息
        /// </summary>
        private static Queue<string> ErrorQueue = new Queue<string>();
        public static void AddError(string msg) 
        {
            ErrorQueue.Enqueue(msg);
        }

随后在 Global 文件中开启一个后台线程,进行日志的保存操作

 LogHelper.WriteLog();

 

转载于:https://www.cnblogs.com/byvar/p/4906729.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值