Каков наилучший способ очистки ресурсов, используемых объектом Crystal Reports ReportDocument? - PullRequest
11 голосов
/ 07 февраля 2012

Я работаю над приложением, которое использует 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 ]

3 голосов
/ 08 февраля 2012

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

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

То, что я не учел, было "Хрустальным Фактором".Как они или ненавидят их, они делают вещи ... по-другому.После МНОЖЕГО поиска в Интернете во втором ответе на эту статью SAP SDN сотрудник SAP, кажется, публикует код метода Close.Как видите, после очистки и удаления всех элементов, составляющих объект ReportDocument, он также вызывает метод ReportDocument.Dispose.

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

1 голос
/ 08 февраля 2012

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

...