Outlook Addin: Как активно освободить память, как это предусмотрено документацией Microsoft? - PullRequest
2 голосов
/ 26 апреля 2020

Надстройка Outlook пытается правильно извлечь исключения Outlook.Exception. Я нашел следующую документацию:

https://docs.microsoft.com/de-de/office/client-developer/outlook/pia/how-to-find-a-specific-appointment-in-a-recurring-appointment-series

Там написано: [...] Когда вы работаете с повторяющимися элементами встречи, вы должны отпустить любые предыдущие ссылки, получить новые ссылки на элемент повторяющейся встречи, прежде чем вы получите доступ или измените элемент, и отпустите эти ссылки, как только вы закончите и сохраните изменения. Эта практика применяется к повторяющемуся объекту AppointmentItem и любому объекту Exception или RecurrencePattern. Чтобы освободить ссылку в Visual Basi c, установите для этого существующего объекта значение Nothing. В C# явно освободите память для этого объекта. [...]

Теперь мой вопрос: как мне это сделать? Пример на указанной странице не освобождает память в явном виде?

Было бы достаточно установить для appt значение null?

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Установка на ноль определенно недостаточно. В этом случае, кроме того, вы должны заставить сборщик мусора провести кучу как можно скорее. Вы делаете это правильно с вызовами на GC.Collect() и GC.WaitForPendingFinalizers(). Вызов дважды безопасен, завершение гарантирует, что циклы также будут очищены.

Но я бы порекомендовал использовать System.Runtime.InteropServices.Marshal.ReleaseComObject для освобождения объекта Outlook, когда вы закончили его использовать. Затем установите переменную Nothing в Visual Basi c (null в C#), чтобы освободить ссылку на объект. Это особенно важно, если ваша надстройка пытается перечислить более 256 элементов Outlook в коллекции, которая хранится на сервере Microsoft Exchange (это число было увеличено в последних версиях). Если вы не освободите эти объекты своевременно, вы можете достичь предела, наложенного Exchange на максимальное количество элементов, открытых одновременно.

Метод ReleaseComObject используется для явного управления временем жизни COM-объекта, используемого из управляемого кода. Этот метод следует использовать для освобождения базового COM-объекта, который своевременно хранит ссылки на ресурсы или когда объекты должны быть освобождены в определенном порядке c.

Каждый раз, когда указатель интерфейса COM входит в общий язык время выполнения (CLR), оно заключено в RCW.

RCW имеет счетчик ссылок, который увеличивается каждый раз, когда указатель COM-интерфейса сопоставляется с ним. Метод ReleaseComObject уменьшает счетчик ссылок RCW. Когда счетчик ссылок достигает нуля, среда выполнения освобождает все свои ссылки на неуправляемом COM-объекте и выдает System.NullReferenceException, если вы пытаетесь использовать объект дальше. Если один и тот же интерфейс COM передается из неуправляемого кода в управляемый более одного раза, счетчик ссылок в оболочке увеличивается каждый раз, а вызов ReleaseComObject возвращает количество оставшихся ссылок.

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

0 голосов
/ 26 апреля 2020

Управление памятью в C# (среда выполнения CLR) автоматизировано c и использует сборщик мусора.

Периодически сборщик мусора проверяет недоступные объекты, подлежащие восстановлению. Этот процесс не является детерминированным c, если вы не форсируете его (но обычно вы не должны).

Чтобы освободить память об объекте, вы просто должны сделать его недоступным: это может произойти в различных комбинациях установки для обнуления всех ссылок на объект-нарушитель или выхода go из области видимости всего из них (при условии, что вы не присвоили его полям свойств).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...