C#. NET Многопоточный доступ к файлам MS Excel - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь импортировать несколько файлов MS Excel (xlsx и xls) с помощью многопоточного процесса; однако я иногда (примерно в 5% случаев) получаю сообщение об ошибке

System.AccessViolationExeption: Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена

... при одновременном открытии нескольких подключений oledb или odb c.

Приложение работает успешно при запуске на один поток.

До сих пор я пробовал:

  • И OLEDB, и ODB C
  • Альтернативные драйверы MS Access (Microsoft.ACE.12 и Microsoft..ACE.16)
  • Альтернативные архитектуры (компиляция для x64 и x86)

Пример кода ниже используется для подключения к файлам;

//// Connecting to file


// Get factory

DbProviderFactory dbfct = DbProviderFactories.GetFactory("System.Data.OleDb");

// Connect to db

DbConnection dbconn = dbfct.CreateConnection();

dbconn.ConnectionString = dataObject.GetSourceConnectionString(filename);

// Attempt to open connection

dbconn.Open();

DbCommand dbcmd = dbconn.CreateCommand();
dbcmd.CommandText = dataObject.GetSourceCommandString(filename);

// Read the data
using (IDataReader sourcerdr = dbcmd.ExecuteReader())
{
    // IDataReader is passed to SQL Bulk copy to load into database
    ProcessDataFromReader(dataObject, sourcerdr, byPassPrepare);
}

// Close & dispose
dbconn.Close();
dbcmd.Dispose();


//// Code used to create multiple tasks to process across multiple threads

// Create x tasks to process

Task[] consumers = new Task[ProcessConcurrency];
for (int i = 1; i <= ProcessConcurrency; i++)
{
    // Log the task ids
    string taskId = i.ToString();
    consumers[i - 1] = Task.Run(() => ConsumeQueue() // Pass off to an object processor
    );
}

// Wait for the processors to complete

await Task.WhenAll(consumers);
...