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