Skip to main content
 首页 » 编程设计

c#之多线程文件访问(加锁控制)

2024年02月23日27rubylouvre

我有两个程序处理同一个文件 我希望第一个程序定期检查文件,如果有任何更改,则对文件进行操作并将其清空。 另一个程序写入文件。 当第二个程序试图写入文件时出现问题,因为它是从第一个程序开始使用的 是否有(如果有任何已实现的 C# 程序会更好)算法来处理这个问题?

请您参考如下方法:

要检查文件是否已更改,您可能首先检查其时间戳。在伪代码中,您可以在监控程序中尝试类似这样的操作:

try { 
  if(FileTimeStampHasChanged(FileName)) { 
    //Attempt to do something with the file 
  } 
} 
catch { 
  // Handle or ignore the exception if you can't open the file (maybe the other application hasn't finished writing). You can always retry later. 
} 

但是,我强烈建议采用完全不同的方法。以下是我建议的选项。

  1. 如果您可以更改写入程序,让它写入一个临时文件(例如output.$$$),并让它在写入完成后立即重命名。重命名是即时的,不会导致任何锁定。根据我的经验,这是最简单的并发访问解决方案之一。
  2. 如果你不能改变写作程序,那就修改阅读程序。使用我在第 1 点中描述的逻辑,让它尝试重命名要读取的文件并处理重命名的副本。如果重命名失败,则意味着编写器尚未完成,可以稍后尝试。
  3. 如果您不能更改任何程序,那么您可以制作自己的“交通督导员”应用程序来实现第 1 点。这需要更多的工作,但仍然可行。就是这样:
    • 将 Writer 配置为写入文件夹,例如“输出”。
    • 将阅读器配置为从另一个文件夹读取,例如“输入”。
    • 编写您的 Traffic Warden,以便它监视输出文件夹,并在文件更改时将其移至输入文件夹。移动也是即时的(实际上与重命名操作相同)。