Я пытаюсь импортировать несколько файлов 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);