C#使用读写锁解决多线程并发写入文件时线程同步的问题

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

多线程同时写入文件

class Program
    {
        static int writeCount = 0;
        static int wrongCount = 0;
        static void Main(string[] args)
        {
            Test();
        }
        static void Test()
        {
            //迭代运行写入内容,由于多个线程同时写入同一个文件将会导致错误
            Parallel.For(0, 100, e =>
            {
                try
                {
                    writeCount++;
                    var logFilePath = "/test.txt";
                    var now = DateTime.Now;
                    var logContent = string.Format("Tid: {0}{1} {2}=>{3}\r\n", Thread.CurrentThread.ManagedThreadId.ToString().PadRight(4), now.ToLongDateString(), now.ToLongTimeString(), writeCount);

                    File.AppendAllText(logFilePath, logContent);
                }
                catch (Exception ex)
                {
                    wrongCount++;
                    Console.WriteLine("累计失败" + wrongCount + "");
                    Console.WriteLine(ex.Message);
                    throw;
                }
            });

            Console.Read();
        }
    }

运行结果

只有部分数据写入了文件

多线程使用读写锁同步写入文件

class Program
    {
        static int writeCount = 0;
        static int wrongCount = 0;
        static void Main(string[] args)
        {
            Test();
        }
        static ReaderWriterLockSlim writeLock = new ReaderWriterLockSlim();
        static void Test()
        {
            //迭代运行写入内容
            Parallel.For(0, 100, e =>
            {
                try
                {
                    writeLock.EnterWriteLock();
                    writeCount++;
                    var logFilePath = "/test.txt";
                    var now = DateTime.Now;
                    var logContent = string.Format("Tid: {0}{1} {2}=>{3}\r\n", Thread.CurrentThread.ManagedThreadId.ToString().PadRight(4), now.ToLongDateString(), now.ToLongTimeString(), writeCount);

                    File.AppendAllText(logFilePath, logContent);
                }
                catch (Exception ex)
                {
                    wrongCount++;
                    Console.WriteLine("累计失败" + wrongCount + "");
                    Console.WriteLine(ex.Message);
                    throw;
                }
                finally
                {
                    writeLock.ExitWriteLock();
                }
            });

            Console.Read();
        }
    }

运行成功,数据全部写入文件

 

转载于:https://www.cnblogs.com/xiaonangua/p/9413338.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值