问题场景:process1.exe向目录c:syslog写入文件,文件格式${unixtimestamp}.txt
process2.exe从c:syslog读取文件
读取的频率比较高,大概毫秒级别100-500ms
一开始的思路
初始代码:
using (var reader = new StreamReader(fileinfo.FullName, Encoding.Default)) //检测文件是否被锁住 { string[] header = null; //1.先把本地原始数据读取上来反序列化成类 var states = serializer.Deserialize(reader.ReadToEnd(), ref header); logger.Log(Level.DEBUG, $"1、原始文件已经转换成实体类."); Trace.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}] 1、原始文件已经转换成实体类."); if (header != null) { Trace.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}] - 文件头:{string.Join(",", header)}"); logger.Log(Level.DEBUG, $"文件头:{string.Join(",", header)}"); } //2.把以上数据按照推送格式转成json数据报文 string proto = serializer.Serialize(states); Trace.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}] 2、实体类已经协议格式生成json报文."); logger.Log(Level.DEBUG, "2、实体类已经协议格式生成json报文."); //3.推送到服务器 sendMessage(proto); Trace.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}] 3、报文已经推送到服务器."); logger.Log(Level.DEBUG, "3、报文已经推送到服务器."); }
发现在多线程执行的过程中
后来在stackoverflow上找到答案:Reading a file used by another process [duplicate]
读取文件代码体改成以下即可
using (var fs = new FileStream(fileinfo.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) .... }