C#多线程读写同一文件处理

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

多线程访问统一资源的异常,

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

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

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

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

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

一、不是用锁处理,多线程访问文件不定时抛出异常

C#多线程读写同一文件处理
C#多线程读写同一文件处理

二、使用读写锁 同步写入文件处理

C#多线程读写同一文件处理

三、补充:初始化FileStream时使用包含文件共享属性(System.IO.FileShare)的构造函数比使用自定义线程锁更为安全和高效

C#多线程读写同一文件处理

原文出处:微信公众号【程序员有道】

原文链接:https://mp.weixin.qq.com/s/JW9nQsXSgJReKXp0gR3iRg

本文观点不代表Dotnet9立场,转载请联系原作者。

发表评论

登录后才能评论