开发者

C#在验证文件共享模式下实现多线程文件写入

开发者 https://www.devze.com 2024-01-05 10:26 出处:网络 作者: rjcql
目录写在前面代码实现 调用示例加锁的情况不加锁的情况总结写在前面 原以为设置了文件共享模式为允许随后写入(FileShare.Write),就可以实现多线程下的正常写入操作,实际情况是使用该模式后不会报线程独占问题
目录
  • 写在前面
  • 代码实现 
  • 调用示例
    • 加锁的情况
    • 不加锁的情况
  • 总结

    写在前面

    原以为设置了文件共享模式为允许随后写入(FileShare.Write),就可以实现多线程下的正常写入操作,实际情况是使用该模式后不会报线程独占问题,但是写入的内容是不完整的,比如开了n个线程,真正写入的内容不仅时序上不连续,且内容也不完整;还是需要额外加锁后才能保证时序及内容的完整性。

    代码实现 

    using System.Text;
     
    public class Program
    {
        static int SuccessCount = 0;
        static int FailureCount = 0;
        static ReaderWriterLockSlim WriteLock = new ReaderWriterLockSlim();
        static object Lock = new object();
     
        static void Main(string[] args)
        {
     
            Console.WriteLine("Hello, World!");
     
            var resjavascriptult = Parallel.For(0, 30, action =>
            {
                WriteTest();
            });
     
            Console.WriteLine(python"写入中...");
            Console.ReadLine();
        }
     
        static void WriteTest()
        {
            try
            {
                WriteLock.EnterWriteLock();
                //lock (Lock)
                //{
                    using (FileStream logFile = new FileStream("test.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write))
                    {
                        SuccessCount++;
       android                 Console.WriteLine("count:" + SuccessCount);
                        var count = SuccessCount;
                        var logContentBytes = Encoding.Default.GetBytes($"{Thread.CurrentThread.ManagedTwww.devze.comhreadId}, {DateTime.Now.ToString("yyyy-MM-dd:HH:mm:ss:ffff")},{count},{Environment.NewLine}");
                        logFile.Seek(0, SeekOrigin.Endjavascript);
                        logFile.Write(logContentBytes, 0, logContentBytes.Length);
                    }
                //}
            }
            catch (Exception ex)
            {
                FailureCount++;
                Console.WriteLine($"Failure Count:{FailureCount}");
            }
            finally { WriteLock.ExitWriteLock(); }
        }
     
    }
    

    调用示例

    加锁的情况

    C#在验证文件共享模式下实现多线程文件写入

    C#在验证文件共享模式下实现多线程文件写入

    不加锁的情况

    C#在验证文件共享模式下实现多线程文件写入

    总结

    如果实际应用的话,还是先塞到线程安全的队列中,再用独立线程来写入,来保证效率和一致性。

    到此这篇关于C#在验证文件共享模式下实现多线程文件写入的文章就介绍到这了,更多相关C#多线程文件写入内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号