Взаимодействие между несколькими AppDomain. Проблемы с разрушением одиночных объектов
Проблема в следующем. Есть приложение, которое работает над созданием дополнительных доменов приложений и загружает туда сборки (пользовательские скрипты). В основном приложении есть несколько объектов, ссылки на которые передают право собственности созданным доменам приложений. Сами объекты - это MarshalByRefObject, и они являются отключенными сервисами времени жизни (InitializeLifetimeService возвращает ноль).
Все это работает. Однако эти AppDomain создаются и уничтожаются... при разрушении, вызванном Unload домена, а ссылки на созданные объекты - забываются.
В общем, в результате постепенно заканчивается память, потому что эти "забытые" объекты не кажутся свободными, хотя у них нигде нет ссылок, а AppDomain, который был ссылками - давно выгружен...
Отсюда вопрос - где ошибка? В чем дело? Почему бы не освободить объекты после выгрузки домена?
Никто не задумывался - учитывать собственные ссылки на эти объекты для каждого загруженного домена, а после его выгрузки - вызывать для каждого объекта RemotingServices.Disconnect (...). Это может хорошо делать, когда пожизненное обслуживание недоступно?
1 ответ
Я бы сделал следующие изменения:
Реализуйте IDisposable и ISponsor для этих типов. Переопределите метод InitializeLifetimeService этих типов и вместо возврата null сделайте каждый экземпляр своим собственным спонсором.
Эти типы должны возвращать положительный интервал времени от обновления до тех пор, пока они не будут удалены. Просто убедитесь, что избавились от них, прежде чем уничтожать домен приложения.