C#在验证文件共享模式下实现多线程文件写入
作者: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#多线程文件写入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!