目录
写在前面
代码实现
调用示例
加锁的情况
不加锁的情况
总结
写在前面
原以为设置了文件共享模式为允许随后写入(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(); }}}
调用示例
加锁的情况
不加锁的情况
总结
如果实际应用的话,还是先塞到线程安全的队列中,再用独立线程来写入,来保证效率和一致性。