Каков наилучший способ очистки ресурсов, используемых объектом 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, но это не совсем верно.
Любой совет будет принят во внимание.
2 ответа
Ну, в соответствии с этим, "Close() ... освободить [s] память, которая используется отчетом". Это указывает на то, что Close () вызывает Dispose(), поэтому было бы излишним иметь как оператор using, так и Close ().
Хотя в Интернете имеется много информации, касающейся правильного использования памяти и соответствующей очистки использованной памяти, когда задачи завершены, например, в MSDN:IDisposable.Dispose или Stackru: удаление и установка на ноль, например. Это приводит к преобладающему соглашению о кодировании: если вы можете вызвать Dispose, сделайте это.
Это соглашение справедливо для таких объектов, как FileStreams и SqlDataReader (среди прочих), где у вас есть методы Close и Dispose, а вызов Dispose вызывает Close.
Чего я не учел, так это "Хрустального фактора". Как они или ненавидят их, они делают вещи... по-другому. После ОЧЕНЬ большего количества онлайн-поиска во втором ответе на эту статью SAP SDN сотрудник SAP, кажется, публикует код метода Close. Как видите, после очистки и удаления всех элементов, составляющих объект ReportDocument, он также вызывает метод ReportDocument.Dispose.
Несмотря на все это, и не зная, как реализован метод Dispose (правильно вы бы предположили, что код работает в своей нынешней форме), вы должны написать код с соответствующим соглашением и вызвать метод Dispose или объявить его в операторе Using. Просто подавьте предупреждение CA.