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#多线程文件写入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 事务在c#中的使用

    事务在c#中的使用

    这篇文章介绍了事务在c#中的使用,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#实现石头剪刀布游戏

    C#实现石头剪刀布游戏

    这篇文章主要为大家详细介绍了C#实现石头剪刀布游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • .NET操作NPOI实现Excel的导入导出

    .NET操作NPOI实现Excel的导入导出

    NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作,下面小编为大家介绍了如何操作NPOI实现Excel的导入导出,需要的可以参考一下
    2023-09-09
  • C# LINQ查询表达式及对应LAMBDA表达式的用法

    C# LINQ查询表达式及对应LAMBDA表达式的用法

    这篇文章主要介绍了C# LINQ查询表达式及对应LAMBDA表达式的用法,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-04-04
  • 登录验证全局控制的几种方式总结(session)

    登录验证全局控制的几种方式总结(session)

    在登陆验证或者其他需要用到session全局变量的时候,归结起来,主要有以下三种较方便的实现方式。(其中个人较喜欢使用第一种实现方法)
    2014-01-01
  • C#探秘系列(一)——ToDictionary,ToLookup

    C#探秘系列(一)——ToDictionary,ToLookup

    这个系列我们看看C#中有哪些我们知道,但是又不知道怎么用,又或者懒得去了解的东西,比如这篇我们要介绍的toDictionary和ToLookup。
    2014-05-05
  • C#中的正则表达式双引号问题

    C#中的正则表达式双引号问题

    正则表达式获取CSS里面的图片的例子,里面有URL里面的图片地址有双引号,要注意用两个双引号表示
    2015-05-05
  • c#图片添加水印的实例代码

    c#图片添加水印的实例代码

    这篇文章介绍了c#图片添加水印的实例代码,有需要的朋友可以参考一下
    2013-07-07
  • c#通过DES加密算法加密大文件的方法

    c#通过DES加密算法加密大文件的方法

    这篇文章主要介绍了c#通过DES加密算法加密大文件的方法,涉及C#文件操作与DES加密的相关技巧,需要的朋友可以参考下
    2015-05-05
  • C#控制台程序中处理2个关闭事件的代码实例

    C#控制台程序中处理2个关闭事件的代码实例

    这篇文章主要介绍了C#控制台程序中处理2个关闭事件的代码实例,本文中的2个关闭事件是指Ctrl+C事件和窗口的关闭按钮事件,需要的朋友可以参考下
    2014-09-09

最新评论