C # P / Invoke в ODBC32.dll сбой при использовании нескольких потоков - PullRequest
1 голос
/ 22 марта 2011

ОБНОВЛЕНИЕ: Следующая ошибка была на самом деле из-за простой ошибки, которую я пропустил. Единственное реальное сообщение здесь, что устал и глуп - плохая комбинация.

По причинам, связанным с некоторыми специфическими функциями драйвера ODBC, который мы вынуждены использовать, я пытался написать небольшое приложение, которое напрямую использует вызовы ODBC. Поскольку C # 2.0 - это то, что я знаю больше всего, я делал это с помощью вызовов P / Invoke в ODBC32.dll.

Код, который я написал изначально, был многопоточным. Но я заметил, что, как только я перебираю потоки, я получаю AccessViolationExceptions. Например, когда я генерирую ссылки IntPtr на среду и соединение в одном потоке, а затем пытаюсь использовать их в другом потоке при генерации оператора (SQLAllocStmt), все это всплывает.

Я уверен, что могу обойти это, но есть ли какая-то очевидная причина для этого? Связана ли неуправляемая память, выделенная вызовами ODBC32.dll, с каким-то конкретным потоком?

1 Ответ

2 голосов
/ 22 марта 2011

Это зависит от:

  • Драйвер odbc: что это?
  • Ваш код: Вы освобождаете память, не осознавая этого?

Рассмотрим:

  • Действительно ли вам нужно это сделать. Разве вы не можете управлять поведением драйвера с помощью строки подключения или с помощью специфичных для драйвера команд через объект команды?
  • Если вам действительно нужно это сделать, можете ли вы выделить его в один поток STA и использовать маршаллинг или очередь задач для упрощения своей работы?
  • Если вам нужно использовать его из нескольких потоков, разве вы не можете быть уверены, что каждый поток имеет свое собственное соединение и среду?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...