C#在驗證文件共享模式下實現(xiàn)多線程文件寫入
寫在前面
原以為設置了文件共享模式為允許隨后寫入(FileShare.Write),就可以實現(xiàn)多線程下的正常寫入操作,實際情況是使用該模式后不會報線程獨占問題,但是寫入的內容是不完整的,比如開了n個線程,真正寫入的內容不僅時序上不連續(xù),且內容也不完整;還是需要額外加鎖后才能保證時序及內容的完整性。
代碼實現(xià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#在驗證文件共享模式下實現(xiàn)多線程文件寫入的文章就介紹到這了,更多相關C#多線程文件寫入內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Unity Shader實現(xiàn)描邊OutLine效果
這篇文章主要為大家詳細介紹了Unity Shader實現(xiàn)描邊OutLine效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-01-01詳解C#中的System.Timers.Timer定時器的使用和定時自動清理內存應用
這篇文章主要介紹了詳解C#中的System.Timers.Timer定時器的使用和定時自動清理內存應用,需要的朋友可以參考下2017-06-06C#導出GridView數(shù)據(jù)到Excel文件類實例
這篇文章主要介紹了C#導出GridView數(shù)據(jù)到Excel文件類,實例分析了C#使用GridView及Excel的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03WPF利用ValueConverter實現(xiàn)值轉換器
值轉換器在WPF開發(fā)中是非常常見的,值轉換器可以幫助我們很輕松地實現(xiàn),界面數(shù)據(jù)展示的問題。本文將通過WPF?ValueConverter實現(xiàn)簡單的值轉換器,希望對大家有所幫助2023-03-03C#基于SQLiteHelper類似SqlHelper類實現(xiàn)存取Sqlite數(shù)據(jù)庫的方法
這篇文章主要介紹了C#基于SQLiteHelper類似SqlHelper類實現(xiàn)存取Sqlite數(shù)據(jù)庫的方法,涉及C#操作SQLite數(shù)據(jù)庫的相關技巧,需要的朋友可以參考下2015-06-06