2015-05-06 3 views
1

В отношении к ответу на вопрос здесь Ханс Passant ... Clean up Excel Interop Objects with IDisposable ...нуждаются в разъяснении на Ответ для очистки Excel Interop объектов Правильно

Он просветил меня в том, что мне не нужно, чтобы следуйте правилу двух точек ... объявляя все COM-объекты, чтобы я мог освободить через Marshal.ReleaseComObject, когда закончите с ними. Итак, теперь я понимаю, что могу просто вызвать GC.Collect и GC.WaitForPendingFinalizers после моего кода Excel, и все объекты будут выпущены должным образом. Во-первых, я думаю, что это здорово и уменьшит длину макросов, которые я пишу в C#, но у меня была привычка выпускать объекты, как только я был сделан с ними, чтобы минимизировать использование памяти во время запуска макроса. Должен ли я быть связан с очисткой объектов, когда я иду, или это нормально, просто делать очистку в конце макроса, как предложил Ганс? Я обычно работаю с огромными файлами, и мои макросы создадут много com-объектов для выполнения задачи.

ответ

0

У меня была привычка выпускать объекты, как только я был сделан с ними, чтобы свести к минимуму использование памяти во время работы макроса. Должен ли я быть связан с очисткой объектов, когда я иду, или это нормально, просто делать очистку в конце макроса, как предложил Ганс?

Как правило, отпустите любой ресурс, как только вы закончите с ним. Чем дороже и/или дефицит ресурса, тем более важным становится. Это верно для соединений с базой данных, памяти, ручек файлов и т. Д.

Он также действителен для ссылок на COM-объекты.

Сказав, что, выполняя

GC.Collect(); 
GC.WaitForPendingFinalizers(); 

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

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

+0

Ну, я бы не рекомендовал руководство GC.Collect() после каждой другой линии. Хорошо, когда вы достигаете завершения значительной операции взаимодействия (например, открываете документ, находите лист, итерации через кучу строк, выпускаете документ, затем выполняете GC.Collect() и GC.WaitForPendingFinalizers ()) –