C# 多线程操作同一文件


在多线程访问读写同一个文件时,经常遇到异常:“文件正在由另一进程使用,因此该进程无法访问此文件”。

解决方案1,可以使用lock,保证读写操作单线程执行

解决方案2,使用System.Threading.ReaderWriterLockSlim ,对读写操作锁定处理

读写锁是以 ReaderWriterLockSlim 对象作为锁管理资源的,不同的 ReaderWriterLockSlim 对象中锁定同一个文件也会被视为不同的锁进行管理,这种差异可能会再次导致文件的并发写入问题,所以 ReaderWriterLockSlim 应尽量定义为只读的静态对象。

ReaderWriterLockSlim 有几个关键的方法,本文仅讨论写入锁:

调用 EnterWriteLock 方法 进入写入状态,在调用线程进入锁定状态之前一直处于阻塞状态,因此可能永远都不返回
调用 TryEnterWriteLock 方法 进入写入状态,可指定阻塞的间隔时间,如果调用线程在此间隔期间并未进入写入模式,将返回false
调用 ExitWriteLock 方法 退出写入状态,应使用 finally 块执行 ExitWriteLock 方法,从而确保调用方退出写入模式。


static
ReaderWriterLockSlim LogWriteLock = new ReaderWriterLockSlim(); public static bool WriteLog(string strValue) { string PathName = string.Format("{0}\\log\\WriteLog{1:d4}{2:d2}{3:d2}.log", AppDomain.CurrentDomain.BaseDirectory, DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); try { LogWriteLock.EnterWriteLock(); string logValue = string.Format("{0}\r\n\r\n", strValue);//G是通用格式 File.AppendAllText(PathName, logValue); } catch (Exception e) { return false; } finally { LogWriteLock.ExitWriteLock(); } return true; }
posted @ 2019-12-11 16:30  码农界的小学生  阅读(2043)  评论(0编辑  收藏  举报