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

 更新时间:2024年01月04日 08:39:21   作者:rjcql  
这篇文章主要为大家详细介绍了C#在验证文件共享模式下实现多线程文件写入的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

写在前面

原以为设置了文件共享模式为允许随后写入(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 result = Parallel.For(0, 30, action =>
        {
            WriteTest();
        });
 
        Console.WriteLine("写入中...");
        Console.ReadLine();
    }
 
    static void WriteTest()
    {
        try
        {
            WriteLock.EnterWriteLock();
            //lock (Lock)
            //{
                using (FileStream logFile = new FileStream("test.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write))
                {
                    SuccessCount++;
                    Console.WriteLine("count:" + SuccessCount);
                    var count = SuccessCount;
                    var logContentBytes = Encoding.Default.GetBytes($"{Thread.CurrentThread.ManagedThreadId}, {DateTime.Now.ToString("yyyy-MM-dd:HH:mm:ss:ffff")},{count},{Environment.NewLine}");
                    logFile.Seek(0, SeekOrigin.End);
                    logFile.Write(logContentBytes, 0, logContentBytes.Length);
                }
            //}
        }
        catch (Exception ex)
        {
            FailureCount++;
            Console.WriteLine($"Failure Count:{FailureCount}");
        }
        finally { WriteLock.ExitWriteLock(); }
    }
 
}

调用示例

加锁的情况

不加锁的情况

总结

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

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

相关文章

  • 如何在Mac系统使用Visual Studio Code运行Python

    如何在Mac系统使用Visual Studio Code运行Python

    这篇文章主要介绍了Mac使用Visual Studio Code运行Python环境的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • C#中接口的显式实现与隐式实现及其相关应用案例详解

    C#中接口的显式实现与隐式实现及其相关应用案例详解

    最近在学习演化一款游戏项目框架时候,框架作者巧妙使用接口中方法的显式实现来变相对接口中方法进行“密封”,增加实现接口的类访问方法的“成本”,这篇文章主要介绍了C#中接口的显式实现与隐式实现及其相关应用案例,需要的朋友可以参考下
    2024-05-05
  • C#使用udp如何实现消息的接收和发送

    C#使用udp如何实现消息的接收和发送

    这篇文章主要介绍了C#使用udp如何实现消息的接收和发送问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • LINQ基础之From和GroupBy子句

    LINQ基础之From和GroupBy子句

    这篇文章介绍了LINQ使用From和GroupBy子句的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#生成图形验证码的实现方式

    C#生成图形验证码的实现方式

    我们当用户登录系统时经常会用到图形验证码技术,要求用户识别图片中的内容,并正确输入,方可尝试登录,因此,图形验证码是一个网络安全技术手段,图形验证码的呈现形式有很多种,这里我们将介绍最基本的生成方式,感兴趣的朋友可以参考下
    2024-04-04
  • WPF开发txt阅读器实现目录提取功能

    WPF开发txt阅读器实现目录提取功能

    这篇文章主要为大家详细介绍了WPF开发txt阅读器时如何实现目录提取功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-06-06
  • C#中使用JSON.NET实现JSON、XML相互转换

    C#中使用JSON.NET实现JSON、XML相互转换

    这篇文章主要介绍了C#中使用JSON.NET实现JSON、XML相互转换的相关代码及示例,需要的朋友可以参考下
    2015-11-11
  • C#子线程执行完后通知主线程的方法

    C#子线程执行完后通知主线程的方法

    下面小编就为大家带来一篇C#子线程执行完后通知主线程的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C#串口编程System.IO.Ports.SerialPort类

    C#串口编程System.IO.Ports.SerialPort类

    这篇文章介绍了C#串口编程System.IO.Ports.SerialPort类,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 基于Unity3D实现3D照片墙效果

    基于Unity3D实现3D照片墙效果

    Unity3D不仅仅可以开发游戏,还有非常多的开发方向。本文就将用Unity3D制作出一个3D照片墙的效果,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-03-03

最新评论