2016-10-24 25 views
-1

次のコードを使用してExcelファイルのすべてのシートをエクスポートしようとしています。私は、異なる値のパラメータを使用して1つのメソッドを呼び出しています。Error - Parallel.Invokeメソッド中にRaceOnRCWCleanupが検出されました

Sheet()メソッドのExecuteNonQueryに次のエラーが表示されます。

RaceOnRCWCleanupは、使用中のRCWを解放するためになされたもので 試みを検出しました。 RCWは、アクティブなスレッドまたは別のスレッドで使用されています。使用中のRCWを解放しようとすると、破損やデータの消失を引き起こす可能性があります。

この操作は可能ですか?そうならば、私が自分のコード

Action[] actionsArray = new Action[] 
{ 
    () => InsertDataToExcelSheet(oleDBcmd,"sheet1",dataTable1), 
    () => InsertDataToExcelSheet(oleDBcmd,"sheet2",dataTable2), 
    () => InsertDataToExcelSheet(oleDBcmd,"sheet3",dataTable3), 
    () => InsertDataToExcelSheet(oleDBcmd,"sheet4",dataTable4), 
    () => InsertDataToExcelSheet(oleDBcmd,"sheet5",dataTable5), 
    () => InsertDataToExcelSheet(oleDBcmd,"sheet6",dataTable6), 
    () => InsertDataToExcelSheet(oleDBcmd,"sheet7",dataTable7), 
    () => InsertDataToExcelSheet(oleDBcmd,"sheet8",dataTable8), 
    () => InsertDataToExcelSheet(oleDBcmd,"sheet9",dataTable9), 
    () => InsertDataToExcelSheet(oleDBcmd,"sheet10",dataTable10), 
    () => InsertDataToExcelSheet(oleDBcmd,"sheet11",dataTable11), 
    () => InsertDataToExcelSheet(oleDBcmd,"sheet12",dataTable12), 
    () => InsertDataToExcelSheet(oleDBcmd,"sheet13",dataTable13), 
    () => InsertDataToExcelSheet(oleDBcmd,"sheet14",dataTable14), 
    () => InsertDataToExcelSheet(oleDBcmd,"sheet15",dataTable15) 
}; 

Parallel.Invoke(actionsArray); 

private static object InsertDataToExcelSheet(OleDbCommand cmd, string sheet, DataTable dt) 
{    
    sheet = sheet.Replace(".", "#"); 
    switch (sheet) 
    { 
     case "Sheet1": 
      Sheet1(cmd, dt, sheet); 
      break; 
     case "Sheet2": 
      Sheet2(cmd, dt, sheet); 
      break; 
     case "Sheet3": 
      Sheet3(cmd, dt, sheet); 
      break; 

    } 
} 

//sheet1,sheet2 ans sheet3 methods are like follows 
private static void Sheet1(OleDbCommand cmd, DataTable dt, string sheet) 
{ 
    int rowNum = 3; 
    foreach (DataRowView row in dt) 
    { 

     string InsertQuery = @"Insert Into [" + sheet + "$A" + rowNum + ":D" + rowNum + "]" + 
          " Values('" + row[0] + "','" + row[1] + "','" + row[2] + "','" + 
              row[3] + "');"; 


     cmd.CommandText = InsertQuery; 
     cmd.ExecuteNonQuery(); 
     rowNum++; 
    } 
}  
+1

基本的に、複数のスレッドで単一のOleDbCommandオブジェクトを使用することは安全ではないことを伝えています。 Excel自体は、データへのアクセスをシリアル化しているため、Parallel.Invoke()で高速化することはありません。 –

答えて

0

にしようとするヒントや解決策を与えてください、私はより高速な方法でファイルをデータをExcelに書きたかったです。私は現在SSISを使用しています。本当に効率的です。助けてくれてありがとう。

関連する問題