2014-01-23 60 views
0

我正试图在Parallel.Foreach循环中将单独的集合写入单独的csv。当我运行这个时,出现以下错误:使用StreamWriter写入Parallel.Foreach中的不同文件

该进程无法访问文件'C:\ temp \ OCRProcess \ 2011 \ 49 \ OCRProcess-2011-49.csv',因为它正在被另一个进程。

当我看着所有的工作进程,他们打开不同的文件,他们都没有使用相同的文件位置。从我所知道的来看,每个线程(工作进程)都没有冲突。

public void GenerateCSVFile(List<CSVFile> csvFiles) 
    { 
     Parallel.ForEach(csvFiles, (csvfile, state, index) => 
      { 
       var fileLocation = _storageLocation + csvfile.Type + s + csvfile.Year + s + csvfile.Day + s + csvfile.Type + "-" + 
          csvfile.Year + "-" + csvfile.Day + ".csv"; 

       if (!File.Exists(fileLocation)) 
       { 
        File.Create(fileLocation); 
       } 

       using (var streamWriter = new StreamWriter(fileLocation)) 
       { 
        foreach (var csvRecord in csvfile.CSVRecords) 
        { 
         streamWriter.WriteLine(csvRecord.Object_Id + "," + csvRecord.DocumentName + "," + csvRecord.BCI_DCN + "," + csvRecord.CreationDate); 
        } 
       }      
      }); 
    } 

以下是CSVFile和CSVRecord类的含义。

public sealed class CSVRecord 
{ 
    public String BCI_DCN { get; set; } 
    public String Object_Id { get; set; } 
    public String DocumentName { get; set; } 
    public String CreationDate { get; set; } 
} 



public sealed class CSVFile 
{ 
    public List<CSVRecord> CSVRecords { get; set; } 
    public String Year { get; set; } 
    public String Type { get; set; } 
    public String Day { get; set; } 

    public CSVFile() 
    { 
     CSVRecords = new List<CSVRecord>(); 
    } 
} 
+0

是否有可能您的清单中有重复的csv文件 csvFiles? – Jason

+0

我看过列表 csvFiles,没有重复。 – munchrall

+0

问题是否总是出现在同一个文件中? – Jason

回答

2

问题归因于File.Create(fileLocation),它返回一个FileStream并保持文件打开。当StreamWriter试图打开它时,它已经打开并导致错误。

要纠正这个问题,删除了以下IF语句:

if (!File.Exists(fileLocation)) 
{ 
    File.Create(fileLocation); 
} 

,并更新了使用语句紧随其后。通过添加TRUE参数,它允许StreamWriter在文件存在的情况下追加到文件中,否则将其创建。

using (var streamWriter = new StreamWriter(fileLocation, true)) 
{ 
    foreach (var csvRecord in csvfile.CSVRecords) 
    { 
     streamWriter.WriteLine(csvRecord.Object_Id + "," + csvRecord.DocumentName + "," + csvRecord.BCI_DCN + "," + csvRecord.CreationDate); 
    } 
} 
+0

有趣的,很高兴知道。 – akousmata

相关问题