如何锁定文件以防止多线程



有一个系统将文件放在磁盘上的文件夹中。

我正在编写一个可执行文件(c#(,它将这些文件发送到数据库中。

我的可执行文件可以在同一时间(并行(启动多次,并且我在处理文件时存在多线程问题。

示例:

  • 文件夹中有50个文件
  • 可执行文件1需要处理10个文件
  • 可执行文件2需要处理10个文件

我的问题是:

  • 如何确保我的可执行文件2不包含可执行文件1文件
  • 如何锁定可执行文件1中的10个文件
  • 如何使该进程线程安全

与其使用多个进程,不如使用一个进程和多个线程。

例如,您可以有一个线程列出磁盘上的文件并将其添加到并发队列中,多个处理线程从队列中获取文件名并进行处理。或者使用数据流之类的东西来做同样的事情。绝对简单的选择可能是创建一个所有文件的列表,并使用Plink-AsParallel来并行处理。

注意IO通常不能很好地并行化;处理";主要涉及读写磁盘,您的收益可能低于预期。

如果你坚持使用多个流程,你可以使用参与者模型来遵循相同的模式,或者让一个管理流程将工作分配给多个工作流程。

我可能不建议只依赖文件锁,因为很难确保文件不会被处理两次。

最好先读取所有文件的列表,然后在线程之间进行划分。否则,可以使用异常

您可以检查该文件是否正在使用中。

try
{
using (Stream stream = new FileStream("File.txt", FileMode.Open))
{
// File ready for 
}
} catch {
//the file is in use.
}   

希望这能有所帮助!

最新更新