Иногда, когда я заканчиваю приложение, и он пытается освободить некоторые COM-объекты, я получаю предупреждение в отладчике:
RaceOnRCWCleanUp
был обнаружен
Если я пишу класс, который использует COM-объекты, мне нужно реализовать IDisposable
и вызвать Marshal.FinalReleaseComObject
на них в IDisposable.Dispose
, чтобы их правильно отпустить?
Если Dispose
не вызывается вручную, тогда мне все равно нужно освободить их в финализаторе или будет автоматически выпущена GC? Теперь я вызываю Dispose(false)
в финализаторе, но мне интересно, правильно ли это.
В COM-объекте, который я использую, также есть обработчик событий, который прослушивает класс. По-видимому, событие возникает в другом потоке, так как правильно его обрабатывать, если он уволен при утилизации класса?