1、简介
本文主要演示日常开发中利用多线程写入文件存在的问题,以及解决方案,本文使用最常用的日志案例!
2、使用File.AppendAllText写入日志
这是种常规的做法,通过File定位到日志文件所在位置,然后写入相应的日志内容,代码如下:
static string _filePath = @"C:\Users\zhengchao\Desktop\测试文件.txt"; static void Main(string[] args) { WriteLogAsync(); Console.ReadKey(); } static void WriteLogAsync() { var logRequestNum = 100000;//请求写入日志次数 var successCount =0;//执行成功次数 var failCount = 0;//执行失败次数 //模拟100000次用户请求写入日志操作 Parallel.For(0, logRequestNum, i => { try { var now = DateTime.Now; var logContent = $"当前线程Id:{Thread.CurrentThread.ManagedThreadId},日志内容:暂时没有,日志级别:Warn,写入时间:{now.ToString()}"; File.AppendAllText(_filePath, logContent); successCount++; } catch (Exception ex) { failCount++; Console.WriteLine(ex.Message); } }); Console.WriteLine($"Request Count:{logRequestNum}. Success Count:{successCount} Failed Count:{failCount}."); }
报错了,原因,Windows不允许多个线程同时操作同一个文件,所以,抛异常.所以必须解决这个问题,首先想到的肯定时锁.所以MSDN一下,找到了一个锁,ReaderWriterLockSlim,这个锁的用途如下: