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