zoukankan      html  css  js  c++  java
  • .net防止写文件线程冲突

    写日志的时候发现,多线程同时操作一个txt文件会报错,一个线程正在占用文件,而当前线程却要操作。

    问了问同事,告诉我这样一个类 System.Threading.ReaderWriterLockSlim

    可以用来控制锁死当前操作,其他的线程等待

    直接上个例子如下,整个过程走完后要等一下,等每个线程写完毕才能看到效果。如果去掉ReadWriteLogSlim则会报错,或者写不完整。

        class Program
        {
            static ReaderWriterLockSlim lockSlim = new ReaderWriterLockSlim();
            static int i = 0;
            static string fileName="test.txt";
            static void Main(string[] args)
            {
                if (File.Exists(fileName)) {//删除历史文件
                    File.Delete(fileName);
                }
                using (FileStream stream = File.Create(fileName))//创建文件
                {
                }
                foreach (var i in Enumerable.Range(0, 100))//分线程启动写日志
                {
                    Task t = new Task(WriteFile);
                    t.Start();
                }
    
                Console.WriteLine("This is the end of program");
                Console.ReadKey(true);
                
            }
    
            public static void WriteFile()
            {
                lockSlim.EnterWriteLock();//打开写操作锁
                try
                {
                    string TestText = i.ToString();
                    string temp = "";
                    using (StreamReader reader = new StreamReader(fileName))
                    {
                        temp = reader.ReadToEnd();
                        reader.Close();
                    }
    
                    using (StreamWriter writer = new StreamWriter(fileName))
                    {
                        writer.WriteLine(temp + TestText);
                        Thread.Sleep(100);//增加写的占用时间用于测试效果
                        writer.Close();
                    }
                    i++;
                }finally
                {
                    lockSlim.ExitWriteLock();//占用完后退出
                }
            }
  • 相关阅读:
    阿里云服务器,http免费转https详细教程
    springboot系列总结(二)---springboot的常用注解
    springboot系列总结(一)---初识springboot
    java 查询当天0点0分0秒
    mysql各个版本驱动jar包下载 mysql/mysql-connector-java/5.1.22
    泰坦尼克 学习
    切片
    忽略warning 警告
    迭代 递归 循环 遍历
    标准化 归一化
  • 原文地址:https://www.cnblogs.com/stupidanimal/p/7234581.html
Copyright © 2011-2022 走看看