2014-01-23 73 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

相關問題