Ошибка — RaceOnRCWCleanup была обнаружена во время параллельной работы.Вызвать метод

#c# #.net #task-parallel-library

#c# #.net #задача-параллельная-библиотека

Вопрос:

Я пытаюсь экспортировать все листы файла Excel, используя следующий фрагмент кода. Я вызываю один метод, используя разные значения параметров.

Это выдает мне следующую ошибку при выполнении запроса одного из методов Sheet ().

Обнаружен запуск 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 он не станет быстрее. Вызовите().

Ответ №1:

Я хотел записать данные в файл Excel более быстрым способом. Сейчас я использую SSIS, и это действительно эффективно. Спасибо вам за помощь.