У меня есть процесс, который может иметь несколько AppDomains. Каждый AppDomain собирает некоторые статистические данные. После требуемого времени я хочу накопить их статистическая величина и сохранить их в файл.
Один способ сделать это - Дистанционная работа, которой я хочу избежать.
Единственная другая техника, которую я имею в виду, состоит в том, чтобы сохранить данные каждого AppDomain в файле, и после того, как определенное время, один из AppDomain собирает все данные, и накопите их.
Но это было бы идеально, если это все могло бы быть сделано в оперативной памяти без стоимости сериализации информации для передачи между AppDomains. У кого-либо есть какие-либо идеи?
Единственный способ избежать сериализации - это представить ваши данные с помощью объектов, которые являются производными от MarshalByRefObject, но в этом случае вам по-прежнему придется платить за маршалинг через границы AppDomain. Это также может включать рефакторинг / переписывание большей части вашего кода.
Предполагая, что сортировка по ссылке не является вариантом, вам придется в какой-то момент сериализовать. Этого просто нельзя избежать. Один из способов сделать это, как предлагает Нил Барнуэлл, с базой данных, другой - с локальным файлом, как вы сами предлагаете.
Другой способ, который может или не может быть осуществим в зависимости от вашего графика доставки и / или принятия .NET 4.0, - это использовать файл с отображением в память, см. .Net Framework 4.0: Использование файлов с отображением в память .
я обычно говорю, просто используйте удаленное взаимодействие. Запись данных в файл также требует сериализации. Сериализация кажется почти неизбежной, какую бы технологию вы ни использовали. Вам необходимо передать данные из одного домена приложения в другой, используя некоторый канал, и вам придется сериализовать данные, чтобы получить их через канал.
Похоже, что единственный способ избежать сериализации - использовать разделяемую память, чтобы оба домена приложений могли получать доступ к данным, даже не проходя через канал. Даже глубокое клонирование данных из памяти одного домена приложения в память другого по своей сути является не чем иным, как двоичной сериализацией (где результат не обязательно сохраняется в последовательных ячейках памяти).
Я ценю, что вы хотите сохранить это в памяти, но мое первое предложение - записать данные в базу данных и запросить оттуда. Удаленное взаимодействие по-прежнему является удаленным вызовом, от которого исходит большая часть «затрат» на использование сервера базы данных, и вам придется встроить обработку транзакций, чтобы убедиться, что вы не потеряете данные. Если вы пишете в базу данных SQL Server, у вас есть поддержка транзакций, готовая и ожидающая вас, и она быстро-быстро-быстро для запросов.