Почему использование FinalReleaseComObject вместо ReleaseComObject?

Комбинация Ctrl + F3 и Ctrl + Сдвиг + F3 для нахождения выбранного и предыдущего выбранного пункта работает очень хорошо на меня.

33
задан Jakub Šturc 27 May 2010 в 17:23
поделиться

1 ответ

Некоторая преамбула ...

Вызываемая оболочка времени выполнения (RCW) вызывает только IUnknown. AddRef один раз в неуправляемом COM-интерфейсе, который он оборачивает. Однако RCW также поддерживает отдельный счет количества управляемых ссылок на сам RCW. Это отдельный счетчик управляемых ссылок, который уменьшается при вызове Marshal.ReleaseComObject. Когда счетчик управляемых ссылок достигает нуля, RCW вызывает IUnknown.Release один раз на неуправляемом COM-интерфейсе.

Marshal.FinalReleaseComObject сводит счетчик управляемых ссылок к нулю с помощью одного вызова и, таким образом, немедленно вызывает обернутый неуправляемый метод IUnknown.Release (при условии, что счетчик управляемых ссылок еще не равен нулю).

Так почему же есть и Marshal.ReleaseComObject, и Marshal.FinalReleaseComObject? Вызов Marshal.FinalReleaseComObject просто избавляет от необходимости писать цикл, вызывающий Marshal. ReleaseComObject несколько раз, пока он не вернет 0, если вы хотите указать, что вы действительно закончили использовать COM-объект сейчас .

Зачем использовать Marshal.ReleaseComObject или Marshal.FinalReleaseComObject? Я знаю две причины:

Первая - обеспечить, чтобы неуправляемые ресурсы (такие как дескрипторы файлов, память и т. Д.), Используемые обернутым COM-объектом, были освобождены как можно скорее в результате вызов неуправляемого метода IUnknown.Release ().

Второй - убедиться, что поток, вызывающий неуправляемый метод IUnknown.Release (), находится под вашим контролем, а не поток финализатора.

Без вызовов любого из этих методов Marshal финализатор RCW будет в конечном итоге вызывает неуправляемый IUnknown. Release () через некоторое время после того, как RCW был собран сборщиком мусора.

Подтверждающие подробности см. В записи блога Visual C ++ Team Смешивание детерминированной и недетерминированной очистки

36
ответ дан 27 November 2019 в 18:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: