解决方案 »

  1.   

                if (!System.IO.File.Exists(Path))
                {
                    System.IO.FileStream f = System.IO.File.Create(Path);
                    f.Close();
                    f.Dispose();
                }
    这种判断根本就不可靠,完全可能两个程序各创建了一次文件,结果一个程序的数据被覆盖掉。
      

  2.   

    比较可靠一点,你应该dll1生成了txt之后,写一条记录到数据库,dll2监控数据库里的记录来读取文件。
    或者通过FileSystemWatch组件来监控文件夹内的文件变动。
      

  3.   

    FileSystemWatch监控文件变动的话,可以防止数据无法读取?
      

  4.   

    catch (Exception ex)
                                    {
                                        Console.WriteLine(ex.ToString());
                                    }这个错误处理太差了,至少要写错误日志, 还要记录ex.StackTrace最重要的,出错了要如何处理???
    读文件失败,数据库连接失败,这些你都没处理,不丢数据才怪
      

  5.   

    这种实时性要求不高的没必要用到FileSystemWatch。DLL1
    以时间命名文件名,比如 20140814091959.tmp,当前LIST中全部数据都写入后再把文件名更名为 20140814091959.txt。
    DLL2
    扫描所有 *.txt,按文件名次序读取,读完一个文件就删除。当DLL2读取时,DLL1正在写入的文件后缀是 .tmp,不在DLL2扫描范围内,就不起冲突。
      

  6.   

    +1
    如果DLL1一次性将所有数据都写入文件,还可以加锁控制让它们不能同时访问文件
    但是你的DLL1是分多次写入的,DLL2如何知道DLL1已经写完了还是没写完?分别通过时间去判断明显是不靠谱的
      

  7.   

    Tiger_Zhao的方法很好,我的程序健壮性太差,很多可能出错的地方都没有考虑。
    我尝试一下,看效果如何!
      

  8.   

    +1但别删除, 把读玩的文件再加个其他后缀, 比如 *.txt.end  这样利于将来回溯.
      

  9.   

    要保留原始数据应该移到其他目录。
    一分钟一个文件,留着影响DLL2的扫描性能。
      

  10.   

    还需要一个就是 DLL2开始准备获取数据的时候,DLL1不能往TMP里面写数据. 
    然后 才能把文件名修改为.txt的格式.  切记 
      

  11.   

    DLL1写完 .tmp 后才更名,无需禁止。
      

  12.   

    Tiger_Zhao:
           根据你的思路,加上对mssql中的数据表主键的修改,更正了数据丢失的问题,非常感谢您的指导!也谢谢以上各位给出的建设性意见!