Взаимодействие между несколькими AppDomain. Проблемы с разрушением одиночных объектов - PullRequest
2 голосов
/ 25 марта 2010

Проблема в следующем. Есть приложение, которое работает над созданием дополнительных доменов приложений и загружает их в сборку (пользовательские сценарии). В основном приложении есть несколько объектов, ссылки на которые передают право собственности созданным доменам приложений. Сами объекты - это MarshalByRefObject, и они являются отключенными сервисами времени жизни (InitializeLifetimeService возвращает ноль).

Все это работает. Однако эти AppDomain создаются и уничтожаются ... с уничтожением, вызванным Unload домена, а ссылки на созданные объекты - забываются.

В общем, в результате постепенное прекращение памяти, потому что эти «забытые» объекты не кажутся освобожденными, хотя у них нигде нет ссылок, а AppDomain, который был ссылками, уже давно выгружен ...

Отсюда вопрос - где ошибка? В чем дело? Почему бы не освобождать объекты после выгрузки домена?

Никто не задумывался - учитывать собственные ссылки на эти объекты для каждого загруженного домена, а после его выгрузки - вызывать для каждого объекта RemotingServices.Disconnect (...). Возможно, это придется делать, когда пожизненное обслуживание недоступно?

1 Ответ

1 голос
/ 19 июня 2010

Я бы внес следующие изменения:

Реализация IDisposable и ISponsor для этих типов. Переопределите метод InitializeLifetimeService этих типов и вместо возврата null сделайте каждый экземпляр своим спонсором.

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

...