两个进程分别对多个TXT文件进行写操作和读操作,但在读操作时总会漏掉几个TXT。晚饭后在线等答复。 C#数据库并发bug 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 if (!System.IO.File.Exists(Path)) { System.IO.FileStream f = System.IO.File.Create(Path); f.Close(); f.Dispose(); }这种判断根本就不可靠,完全可能两个程序各创建了一次文件,结果一个程序的数据被覆盖掉。 比较可靠一点,你应该dll1生成了txt之后,写一条记录到数据库,dll2监控数据库里的记录来读取文件。或者通过FileSystemWatch组件来监控文件夹内的文件变动。 FileSystemWatch监控文件变动的话,可以防止数据无法读取? catch (Exception ex) { Console.WriteLine(ex.ToString()); }这个错误处理太差了,至少要写错误日志, 还要记录ex.StackTrace最重要的,出错了要如何处理???读文件失败,数据库连接失败,这些你都没处理,不丢数据才怪 这种实时性要求不高的没必要用到FileSystemWatch。DLL1以时间命名文件名,比如 20140814091959.tmp,当前LIST中全部数据都写入后再把文件名更名为 20140814091959.txt。DLL2扫描所有 *.txt,按文件名次序读取,读完一个文件就删除。当DLL2读取时,DLL1正在写入的文件后缀是 .tmp,不在DLL2扫描范围内,就不起冲突。 +1如果DLL1一次性将所有数据都写入文件,还可以加锁控制让它们不能同时访问文件但是你的DLL1是分多次写入的,DLL2如何知道DLL1已经写完了还是没写完?分别通过时间去判断明显是不靠谱的 Tiger_Zhao的方法很好,我的程序健壮性太差,很多可能出错的地方都没有考虑。我尝试一下,看效果如何! +1但别删除, 把读玩的文件再加个其他后缀, 比如 *.txt.end 这样利于将来回溯. 要保留原始数据应该移到其他目录。一分钟一个文件,留着影响DLL2的扫描性能。 还需要一个就是 DLL2开始准备获取数据的时候,DLL1不能往TMP里面写数据. 然后 才能把文件名修改为.txt的格式. 切记 DLL1写完 .tmp 后才更名,无需禁止。 Tiger_Zhao: 根据你的思路,加上对mssql中的数据表主键的修改,更正了数据丢失的问题,非常感谢您的指导!也谢谢以上各位给出的建设性意见! 全屏判断与离开判断 c#有没办法打开快捷方式 innerhtml可以放置asp.net控件吗? 如何修改HtmlDocument中JS函数? asp.net工程中类的测试 一个简单的问题! 哪位老大能把以下代码翻译成C#的代码,谢谢了 讨论,C#能实现混音吗,即为一段录音配上背景音乐 请问在DataGrid控件中如何得到当前行 关于输出Excel的一点小问题 VS里面,表格总是更新失败 c#如何向httpserver发送xml报文和接收并解析xml报文(不是xml串)
{
System.IO.FileStream f = System.IO.File.Create(Path);
f.Close();
f.Dispose();
}
这种判断根本就不可靠,完全可能两个程序各创建了一次文件,结果一个程序的数据被覆盖掉。
或者通过FileSystemWatch组件来监控文件夹内的文件变动。
{
Console.WriteLine(ex.ToString());
}这个错误处理太差了,至少要写错误日志, 还要记录ex.StackTrace最重要的,出错了要如何处理???
读文件失败,数据库连接失败,这些你都没处理,不丢数据才怪
以时间命名文件名,比如 20140814091959.tmp,当前LIST中全部数据都写入后再把文件名更名为 20140814091959.txt。
DLL2
扫描所有 *.txt,按文件名次序读取,读完一个文件就删除。当DLL2读取时,DLL1正在写入的文件后缀是 .tmp,不在DLL2扫描范围内,就不起冲突。
如果DLL1一次性将所有数据都写入文件,还可以加锁控制让它们不能同时访问文件
但是你的DLL1是分多次写入的,DLL2如何知道DLL1已经写完了还是没写完?分别通过时间去判断明显是不靠谱的
我尝试一下,看效果如何!
一分钟一个文件,留着影响DLL2的扫描性能。
然后 才能把文件名修改为.txt的格式. 切记
根据你的思路,加上对mssql中的数据表主键的修改,更正了数据丢失的问题,非常感谢您的指导!也谢谢以上各位给出的建设性意见!