C # код для выполнения кода в другом домене приложения? - PullRequest
2 голосов
/ 27 сентября 2011

У меня есть программа, которая выполняется в течение 24 часов, затем перезапускается.

Как я могу перевести main () из отдельного домена приложения, который разрушается и обновляется каждые 24 часа, чтобы полностью устранить любые потенциальные утечки памяти?

Ответы [ 3 ]

17 голосов
/ 27 сентября 2011

Вы были со мной, пока не сказали:

, чтобы полностью устранить возможные утечки памяти?

Если вы хотите запустить код в другом домене приложения, есть множество ресурсов, как это сделать, например, Выполнение кода в другом домене приложения (C # и Visual Basic) . Основной принцип заключается в создании класса, который наследуется от MarshalByRefObject. Затем вы создаете новый домен приложения и поручаете ему создать экземпляр этого объекта - тогда этот объект является вашей «точкой входа» в домен вашего приложения:

AppDomain newAppDomain = AppDomain.CreateDomain("NewApplicationDomain");
ProxyObject proxy = (ProxyObject)newAppDomain.CreateInstanceAndUnwrap("MyAssembly", "MyNamespace.MyProxy");

Однако в C # на самом деле не существует такой вещи, как «утечка памяти», в лучшем случае вы просто имеете объекты, которые непреднамеренно сохраняются в области видимости. Если это так, то домен приложения просто излишний - все, что вам действительно нужно сделать, это удалить ссылки на управляемые объекты, которые больше не нужны, и сборщик мусора свяжет их для вас.

Если у вас есть настоящая утечка памяти в неуправляемом коде, домен приложения вам тоже не поможет. Неуправляемые типы не ограничены доменами приложения, поэтому любая неуправляемая память, выделенная «внутри» домена приложения, не будет освобождена при разрушении домена приложения. В этом случае вам лучше использовать отдельные процессы.

8 голосов
/ 03 января 2012

Я создал класс, который позволяет вам выполнять код в отдельном домене приложения, который позволит вам располагать домен приложения и воссоздавать его: Выполнение кода в отдельном домене приложения с использованием C #

0 голосов
/ 27 сентября 2011

Вы не можете.Процесс изолирован и независим, и вы не можете перенести поток из одного процесса в другой.

Что вы можете сделать, однако, если вы абсолютно не можете устранить утечки памяти внутри, это создать сторожевой таймерпрограмма, которая запускает приложение, когда оно перестает работать, и настраивает ваше приложение для запуска только в режиме одиночного выполнения.

...