使用Parallel.for循环导致文件I / O问题

时间:2016-01-28 16:43:21

标签: c# multithreading file-io parallel-processing task-parallel-library

我有一个控制台应用程序,计划处理大量的平面文件。为了提高性能,我提供了使用并行处理的选项。它大大提高了性能。但是,当某些迭代正在复制和删除文件时,它现在会导致奇怪的错误。我不知道为什么会这样或者如何解决它。我不明白为什么迭代所分配的线程会发生冲突,因为每个文件和相关的ID都不同。这是我的基本代码和错误:

result

错误是1)"无法找到文件......"或2)"进程无法访问文件..."

有关如何修复/诊断正在发生的事情的任何建议?

1 个答案:

答案 0 :(得分:0)

我认为问题很可能是File.Copy()的进程仍然处理原始文件,因此File.Delete()失败了。

我建议您使用File.Move(),因为这实际上是资源消耗较少。在内部,File.Move()使用Win32Native.MoveFile函数,该函数在文件系统上进行重命名。如果使用File.Copy(),您实际上将复制磁盘上的数据,这将更加耗费资源并且速度更慢。但是,如果您需要保留两份数据(在您的示例中看起来并非如此),则应避免使用File.Move()

您所需的代码更改看起来有点像这样:

try
{
    File.Move(fileName, fileNameDone);
}

您可能还希望更仔细地查看catch块并更明确地定位已知错误,即

catch (IOException ex)
{
    // specific error type expected
}

希望这会让你更进一步。