zoukankan      html  css  js  c++  java
  • 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} ", strValue);//G是通用格式 File.AppendAllText(PathName, logValue); } catch (Exception e) { return false; } finally { LogWriteLock.ExitWriteLock(); } return true; }
  • 相关阅读:
    如何理解volatile关键字
    Spring 4+JMS+ActiveMQ Example with Annotations
    Spring MVC如何获得客户端IP地址
    PDFBox –如何读取PDF的内容
    Spring MVC 使用Ehcache作为缓存的例子
    自定义了一个data table控件
    Linux基本配置
    位操作学习
    QT——QPainter类详解
    QT——设计文件的和控制类的关联问题
  • 原文地址:https://www.cnblogs.com/zhengxia/p/12023337.html
Copyright © 2011-2022 走看看