Обмен данными между AppDomains

У меня есть процесс, который может иметь несколько AppDomains. Каждый AppDomain собирает некоторые статистические данные. После требуемого времени я хочу накопить их статистическая величина и сохранить их в файл.

Один способ сделать это - Дистанционная работа, которой я хочу избежать.

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

Но это было бы идеально, если это все могло бы быть сделано в оперативной памяти без стоимости сериализации информации для передачи между AppDomains. У кого-либо есть какие-либо идеи?

18
задан ata 5 February 2010 в 11:54
поделиться

3 ответа

Единственный способ избежать сериализации - это представить ваши данные с помощью объектов, которые являются производными от MarshalByRefObject, но в этом случае вам по-прежнему придется платить за маршалинг через границы AppDomain. Это также может включать рефакторинг / переписывание большей части вашего кода.

Предполагая, что сортировка по ссылке не является вариантом, вам придется в какой-то момент сериализовать. Этого просто нельзя избежать. Один из способов сделать это, как предлагает Нил Барнуэлл, с базой данных, другой - с локальным файлом, как вы сами предлагаете.

Другой способ, который может или не может быть осуществим в зависимости от вашего графика доставки и / или принятия .NET 4.0, - это использовать файл с отображением в память, см. .Net Framework 4.0: Использование файлов с отображением в память .

15
ответ дан 30 November 2019 в 06:25
поделиться

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

Похоже, что единственный способ избежать сериализации - использовать разделяемую память, чтобы оба домена приложений могли получать доступ к данным, даже не проходя через канал. Даже глубокое клонирование данных из памяти одного домена приложения в память другого по своей сути является не чем иным, как двоичной сериализацией (где результат не обязательно сохраняется в последовательных ячейках памяти).

4
ответ дан 30 November 2019 в 06:25
поделиться

Я ценю, что вы хотите сохранить это в памяти, но мое первое предложение - записать данные в базу данных и запросить оттуда. Удаленное взаимодействие по-прежнему является удаленным вызовом, от которого исходит большая часть «затрат» на использование сервера базы данных, и вам придется встроить обработку транзакций, чтобы убедиться, что вы не потеряете данные. Если вы пишете в базу данных SQL Server, у вас есть поддержка транзакций, готовая и ожидающая вас, и она быстро-быстро-быстро для запросов.

3
ответ дан 30 November 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: