C# 多线程FileStream读写锁

有时候某些线程读配置,很简单的用FileStream file = new FileStream("1.txt", FileMode.Open);就打开文件了,然后开始读了。
而习惯了直接单开一个线程去读文件这种情况,很容易就遇到了文件正在读的时候,然后就冲突了……

下面写了一个简单的读写过程:

 		static void ReadFunction()
        {
            Console.WriteLine(DateTime.Now.ToString() + "    " + "ReadFunction");
            lockSlim.EnterReadLock();
            try
            {
                FileStream file = new FileStream("1.txt", FileMode.Open, FileAccess.Read);
                Console.WriteLine(DateTime.Now.ToString() + "    " + "file open ok");
                byte[] bytearray = new byte[1024];
                file.Read(bytearray, 0, (int)file.Length);
                Console.WriteLine(DateTime.Now.ToString() + "    " + Encoding.UTF8.GetString(bytearray));
                Thread.Sleep(5000);
                file.Dispose();
                Console.WriteLine(DateTime.Now.ToString() + "    " + "file dispose ok");
            }
            finally
            {
                lockSlim.ExitReadLock();
            }
        }


        static void WriteFunction()
        {
            Console.WriteLine(DateTime.Now.ToString() + "    " + "WriteFunction");
            lockSlim.EnterWriteLock();
            try
            {
                FileStream file = new FileStream("1.txt", FileMode.Open, FileAccess.ReadWrite);
                Console.WriteLine(DateTime.Now.ToString() + "    " + "file open ok");
                byte[] bytearray = new byte[1024];
                int length = file.Read(bytearray, 0, (int)file.Length);
                bytearray[length - 1] += 1;
                file.Seek(0, SeekOrigin.Begin);
                file.Write(bytearray, 0, length);
                Console.WriteLine(DateTime.Now.ToString() + "    " + Encoding.UTF8.GetString(bytearray));
                Thread.Sleep(5000);
                file.Dispose();
                Console.WriteLine(DateTime.Now.ToString() + "    " + "file dispose ok");
            }
            finally
            {
                lockSlim.ExitWriteLock();
            }
        }
        static ReaderWriterLockSlim lockSlim = new ReaderWriterLockSlim();
        static void Main(string[] args)
        {
            new Thread(ReadFunction).Start();
            Thread.Sleep(100);//避免线程调度先启动WriteFunction
            new Thread(ReadFunction).Start();

            new Thread(WriteFunction).Start();
            new Thread(ReadFunction).Start();


            Console.ReadLine();
        }
    }

结果如下:
在这里插入图片描述

注意:
ReaderWriterLockSlim 是分读和写的,如果是读过程,要加读锁EnterReadLock,并且使用FileStream file = new FileStream("1.txt", FileMode.Open, FileAccess.Read);进行读,一定要加FileAccess字段,不然要提示另一线程正在访问对象这种异常的。

微软NetFramework参考资料:
ReaderWriterLockSlim Class

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值