.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();//占用完后退出
            }
        }

 

posted @ 2017-07-25 15:52  lanpang  阅读(639)  评论(0编辑  收藏  举报