C# 如何在没有进程锁的情况下一次处理一堆文件

C# 如何在没有进程锁的情况下一次处理一堆文件,c#,C#,下面是每30秒运行一次的代码。通过C#计时器 有时在sourcePathpath中,我有大量的文件,看起来它并没有在30秒内完成,其他计时器启动。由于这一点,我经常收到文件使用错误 进程无法访问文件“D:\path\file1.Zip”,因为其他进程正在使用该文件 如何应对?请建议 每隔30秒。我可以一次处理一个文件,但由于文件数量很大,这会减慢处理速度 我不知道在一个文件处理过程中要花费多少时间 我使用的一种常见模式是标记正在处理的文件,这样其他进程就不会试图触及它们-如果您计划并行处理,这

下面是每30秒运行一次的代码。通过C#计时器

有时在
sourcePath
path中,我有大量的文件,看起来它并没有在30秒内完成,其他计时器启动。由于这一点,我经常收到文件使用错误

进程无法访问文件“D:\path\file1.Zip”,因为其他进程正在使用该文件

如何应对?请建议

  • 每隔30秒。我可以一次处理一个文件,但由于文件数量很大,这会减慢处理速度
  • 我不知道在一个文件处理过程中要花费多少时间

我使用的一种常见模式是标记正在处理的文件,这样其他进程就不会试图触及它们-如果您计划并行处理,这也很有用

var sourceFiles = Directory.GetFiles("*.zip");
foreach (var sourceFile in sourceFiles)
{
    var tempFilename = sourceFile + ".processing";
    try  
    {
        if (File.Exists(sourceFile))
        {                  
             File.Move(sourceFile, tempFilename);
             var success = await ProcessFileAsync(sourceFile);
             if (success)
             {
                 File.Move(tempFilename, sourceFile + ".done");
             }
             else 
             {
                 File.Move(tempFilename, sourceFile);
             }
        }
    }
    catch 
    {
         // Rename the file back to be attempted later.
         File.Move(tempFilename, sourceFile);
    }
}

启动时禁用计时器。完成后重新启用,选项B)计时器可能不适合您
var sourceFiles = Directory.GetFiles("*.zip");
foreach (var sourceFile in sourceFiles)
{
    var tempFilename = sourceFile + ".processing";
    try  
    {
        if (File.Exists(sourceFile))
        {                  
             File.Move(sourceFile, tempFilename);
             var success = await ProcessFileAsync(sourceFile);
             if (success)
             {
                 File.Move(tempFilename, sourceFile + ".done");
             }
             else 
             {
                 File.Move(tempFilename, sourceFile);
             }
        }
    }
    catch 
    {
         // Rename the file back to be attempted later.
         File.Move(tempFilename, sourceFile);
    }
}