Ускорение взаимодействия между доменами приложений
-
18-09-2019 - |
Вопрос
Я пытаюсь выполнить некоторую логику на нескольких доменах приложений параллельно.Я делаю это, потому что я работаю с устаревшим кодом, который "неизменяем", и я хочу повысить производительность, распараллелив некоторые вещи.Проблема в том, что если я запускаю несколько экземпляров в пределах 1 AppDomain, все они полагаются на некоторые статические структуры данных и мешают друг другу.
Моя реализация проста.Я хочу запустить несколько экземпляров моего класса "ExecutionHarness" - каждый в своем собственном домене приложения - поэтому я создал класс "ExecutionHarnessProxy :MarshalByRefObject", который я создаю в каждом из моих доменов приложений (поскольку ExecutionHarness не наследуется от MarshalByRefObject).Затем я просто передаю параметр "ExecutionData[] data" в метод "ExecutionHarnessProxy.Execute()".Затем этот парень вызывает "ExecutionHarness.Выполнить()", и все хорошо.
Моя проблема сейчас в том, что всякий раз, когда я передаю свой массив данных прокси-классу, это занимает целую ВЕЧНОСТЬ.Класс ExecutionData имеет атрибут [Serializable], и функционально все это работает, но мне было интересно, есть ли какой-нибудь способ ускорить это.
- Могло бы быть быстрее, если бы я сам выполнил сериализацию / десериализацию по обе стороны границы AppDomain?
- Неужели все это время потрачено на сериализацию?или это просто передача сериализованных данных между доменами приложений?
Решение
Это трудно понять без дополнительной информации, но из того, что вы описываете, я бы заподозрил ExecutionData
виновником является массив.
Каждый раз, когда вы вызываете метод, которому требуются эти данные, вы будете сериализовывать данные в AppDomain и, возможно, также возвращать их обратно.Если этот массив большой, это может отнять довольно много времени на обработку.
Было бы лучше, если бы данные можно было загружать непосредственно в каждый домен приложения и передавать только результаты выполнения обратно в ваш основной домен приложения.Если вы сможете избежать передачи массивов данных между доменами приложений, вы, скорее всего, значительно ускорите процесс.