Использование доменов приложений для распараллеливания не поточно-безопасной DLL - PullRequest
7 голосов
/ 16 мая 2011

У меня есть неуправляемая C ++ DLL, которую мое приложение .NET использует через p / invoke.Метод, который мне нужен из этой DLL, довольно трудоемкий, и я хотел бы распараллелить вызовы метода.Проблема в том, что он использует кучу статических и глобальных переменных, поэтому не является поточно-ориентированным (и не может быть изменен).Мой план состоял в том, чтобы преодолеть эту не поточнобезопасную проблему путем параллельного вызова неуправляемой DLL из нескольких доменов приложений.

Я могу без проблем вызывать неуправляемый код из нескольких доменов приложений, если не будуэто параллельно, но как только я делаю звонки параллельно, я получаю AccessViolationException.Я использую Parallel.For () для параллельных вызовов.

Можно ли сделать неуправляемую неуправляемую DLL «поточно-ориентированной», просто совершая вызовы из нескольких доменов приложений?

Ответы [ 3 ]

7 голосов
/ 16 мая 2011

Вызов нативного метода из нескольких AppDomain экземпляров вам здесь совсем не поможет. AppDomain границы не применяются к собственным DLL, и они не принесут никакой пользы

2 голосов
/ 16 мая 2011

В первую очередь: Загрузка нескольких копий DLL в одном процессе

Вы должны убедиться, что все вызовы внутри домена приложения находятся в одном потоке.

ParallelFor не может этого сделать, поэтому вам нужно

  • распараллеливание вручную (разбить цикл на каждый поток / домен приложения)
  • лучше (ИМХО): напишите функцию-обертку, которая будет использовать конкретный экземпляр вашей родной библиотеки DLL (например, с помощью ссылки на домен приложения из локального хранилища потока?).

Обратите внимание, что в зависимости от сложности вашей ситуации (обратные вызовы, использование глобальных данных в управляемой библиотеке) вы можете захотеть ограничить выполнение каждого AppDomain определенным ядром ЦП (соответствие ядра: см. Begin/EndThreadAffinity). Я мог бы быть немного параноиком здесь:)

0 голосов
/ 16 мая 2011

Оберните C ++ DLL в EXE и распараллелите вызовы процессов (вместо запуска этого кода в потоках или доменах приложений).У меня была эта проблема с GeckoFX, которая не любит потоки, и это решение работало просто отлично.Конечно, вам решать управлять этими процессами.Я писал об этом некоторое время назад.

...