写日志的时候发现,多线程同时操作一个txt文件会报错,一个线程正在占用文件,而当前线程却要操作。
问了问同事,告诉我这样一个类 System.Threading.ReaderWriterLockSlim
可以用来控制锁死当前操作,其他的线程等待
直接上个例子如下,整个过程走完后要等一下,等每个线程写完毕才能看到效果。如果去掉ReadWriteLogSlim则会报错,或者写不完整。
class Program { static ReaderWriterLockSlim lockSlim = new ReaderWriterLockSlim(); static int i = 0; static string fileName="test.txt"; static void Main(string[] args) { if (File.Exists(fileName)) {//删除历史文件 File.Delete(fileName); } using (FileStream stream = File.Create(fileName))//创建文件 { } foreach (var i in Enumerable.Range(0, 100))//分线程启动写日志 { Task t = new Task(WriteFile); t.Start(); } Console.WriteLine("This is the end of program"); Console.ReadKey(true); } public static void WriteFile() { lockSlim.EnterWriteLock();//打开写操作锁 try { string TestText = i.ToString(); string temp = ""; using (StreamReader reader = new StreamReader(fileName)) { temp = reader.ReadToEnd(); reader.Close(); } using (StreamWriter writer = new StreamWriter(fileName)) { writer.WriteLine(temp + TestText); Thread.Sleep(100);//增加写的占用时间用于测试效果 writer.Close(); } i++; }finally { lockSlim.ExitWriteLock();//占用完后退出 } }