Каков наилучший способ очистки ресурсов, используемых объектом Crystal Reports ReportDocument?

Я работаю над приложением, использующим Crystal Reports для отчетов. Он открывает данный отчет в объекте ReportDocument, выполняет то, что ему нужно, и затем закрывает отчет.

using (var report = OpenReport(reportSourceInfo))
{
    // Do stuff with the report
    report.Close();
}

Метод OpenReport выполняет некоторую проверку исходного файла и возвращает открытый объект ReportDocument.

Тестирование показало, что этот код делает то, что он должен делать, и, похоже, не имеет проблем. Проблема, о которой я действительно советую, - это когда я создаю проект анализа кода (CA) проекта отчетности, я получаю следующее сообщение CA:

CA2202: Microsoft.Usage: Объект "отчет" может быть удален более чем один раз в методе "CrystalReportingProvider.ReportExecute(ReportSourceInformation)". Чтобы избежать генерации исключения System.ObjectDisposedException, вы не должны вызывать Dispose более одного раза для объекта.

Теперь, очевидно, я могу изменить код, поэтому я не получаю это предупреждение CA, но мой вопрос должен ли я?

Использует ли метод Crystal Reports ReportDocument.Close() все для правильной очистки ресурсов? Похоже, что сообщение указывает, что метод Close вызывает метод Dispose, но это кажется неправильным.

Любые советы будут оценены.

Ответ 1

Хорошо, согласно this, "Закрыть()... освободить [s] память, которая используется в отчете". Это означало бы, что Close() вызывает Dispose(), поэтому было бы излишним иметь как оператор using, так и Close().

Ответ 2

В то время как в Интернете имеется много информации, касающейся надлежащего использования памяти и соответствующей очистки используемой памяти при выполнении задач, MSDN: IDisposable.Dispose или fooobar.com/info/26610/..., например. Это приводит к преобладающему соглашению о кодировании, которое, если вы можете вызвать Dispose, затем сделайте это.

Это соглашение справедливо для таких объектов, как FileStreams и SqlDataReader (среди прочих), где у вас есть методы Close и Dispose, а вызов Dispose вызывает Close.

То, что я не принимал во внимание, было "Кристаллический фактор". Подобно им или ненавидите их, они делают вещи... по-разному. После многократного поиска в Интернете во втором ответе на этот Статья SAP SDN, Сотрудник SAP, кажется, публикует код метода Close. Как вы можете видеть, после очистки и удаления всех элементов, входящих в объект ReportDocument, он вызывает метод ReportDocument.Dispose.

Несмотря на все это и не зная, как реализован метод Dispose (правильно вы предположили бы, что код работает в его нынешнем виде), вы должны закодировать правильное соглашение и вызвать метод Dispose или объявить его в выражение. Просто подавите предупреждение CA.