Wpf Crystal сообщить о проблеме утечки памяти - PullRequest
0 голосов
/ 15 ноября 2018

У меня проблема с отчетом Crystal Report в wpf. При постоянном открытии отчетов в нашем приложении через некоторое время программа просмотра отчетов Crystal перестает загружать отчеты Crystal и выдает исключение:

Загрузить отчетне удалось.Неподдерживаемая операция.Документ, обработанный механизмом JRC, нельзя открыть в стеке C ++.

Сведения об исключении:

CrystalDecisions.ReportAppServer.ReportClientDocumentWrapper.EnsureDocumentIsOpened () в CrystalDecisions.CrystalReports.Engine.CrystalDecisions.CrystalReports.Engine.ReportDocument.SetDataSourceInternal (значение объекта, тип Type) в CrystalDecisions.CrystalReports.Engine.ReportDocument.SetDataSource (набор данных DataSet) **

При мониторинге диспетчера задач в это время язаметил, что отчет Crystal, который я разместил перед закрытием окна средства просмотра отчетов Crystal, не освобождает использованную память для средства просмотра отчетов / отчетов.Это на самом деле вызывает проблему.Есть ли другой способ правильно расположить объект отчета Crystal?

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

Вот мой блок кода

CReportManager.cs

private bool GenerateReport(object oValue, bool bNeedPreview)
{
    Reports.crtSampleReport ocrtSample = null ;
    System.Drawing.Printing.PrintDocument doctoprint = null ;

    // its a usercontrol placed on this assembly
    PopUp.ucManagePrintPreview oPrintPreview = null;

    try
    {
        //pass the data to feed the report from other classes ( from same / different assembly ) 
        System.Data.DataSet dsPrintData = (System.Data.DataSet)oValue;

        if (dsPrintData == null || dsPrintData.Tables[2].Rows.Count == 0)
            throw new GOGGeneralHelpers.CGOGCustomException(
                "Print Data is Null", "No Data Available To Print", GOGGeneralHelpers.EnumLogType.ERR);

        ocrtSample = new Reports.crtSampleReport( ) ;
        ocrtSample.SetDataSource( dsPrintData ) ;
        ocrtSample.PrintOptions.PaperOrientation = CrystalDecisions.Shared.PaperOrientation.Portrait;

        System.Windows.Forms.DialogResult enDialogResult = System.Windows.Forms.DialogResult.OK;

        if (bNeedPreview)
        {     
            // if user want to view the preview before printing the report then its loads 
            // to a crystal report viewer placed on a usercontrol on this same assembly

            oPrintPreview = new PopUp.ucManagePrintPreview();
            oPrintPreview.FillReport( ocrtSample ) ;

            //a Window object placed on another assembly
            EHRPresentationBaseClassLibrary.Popups.PopupWindow
                        oPopupWindow = new EHRPresentationBaseClassLibrary.Popups.PopupWindow( ) ;

            //add the user control object (with crystal report viewer) to this window object            
            oPopupWindow.SetPopupPage( oPrintPreview ) ;
            oPopupWindow.Title = "Print Preview";
            oPopupWindow.Width = GOGPresentationCommonClassesLibrary.CCurrentAppSettings.CurrentAppSettings.PageWidth * .9;
            oPopupWindow.Height = System.Windows.SystemParameters.PrimaryScreenHeight * .8;
            oPopupWindow.ShowDialog();
            enDialogResult = oPrintPreview.PageResult ;                   
        }

        if (enDialogResult == System.Windows.Forms.DialogResult.Cancel
                    || enDialogResult == System.Windows.Forms.DialogResult.None) return true;

        //// Read printer name from a config file ///////////////////////

        System.IO.StreamReader oReader = System.IO.File.OpenText("PrintConfig.bat");
        string sPrinterName = oReader.ReadLine();
        oReader.Close();

        doctoprint = new System.Drawing.Printing.PrintDocument( ) ;
        doctoprint.PrinterSettings.PrinterName = sPrinterName ;

        //validate readed printer name is valid or not
        if ( !doctoprint.PrinterSettings.IsValid )
            throw new GOGGeneralHelpers.CGOGCustomException(
                "Selected Printer is not Valid", "Selected Printer is not Valid", GOGGeneralHelpers.EnumLogType.ERR ) ;

        ///////////////////////////////////////////////////////////////

        ocrtSample.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperA4;

        ocrtSample.PrintOptions.PrinterName = sPrinterName;
        ocrtSample.PrintToPrinter(0, false, 0, 0);
        bReturn = true ;
    }
    catch (GOGGeneralHelpers.CGOGCustomException oCGOGCustomException)
    {                
        GOGPresentationCommonClassesLibrary.CApplicationHelper.
                    ApplicationHelper.ShowUserMessage(oCGOGCustomException, false, false);
        GOGGeneralHelpers.CGOGClientLogWriter.ClientLogWriter.WriteLog(oCGOGCustomException);
    }
    catch (System.Exception oException)
    {
        //Write to log file
        GOGGeneralHelpers.CGOGClientLogWriter.ClientLogWriter.WriteLog(oException);

        //Showing message to user
        GOGPresentationCommonClassesLibrary.CApplicationHelper.
                    ApplicationHelper.ShowUserMessage("Unexpected error on printing", oException, false, false);
    }

    // disposing the crystal report object
    // here is the issue its not releasing consumed memeory
    ocrtSample.Close(); 
    ocrtSample.Dispose();
    ocrtSample = null;

    doctoprint.Dispose();
    doctoprint = null;

    // disposing the crystal report viewer object
    oPrintPreview.ClearReportViewer();

    //this is also not working
    System.GC.Collect();
}

PopUp.ucManagePrintPreview.cs

//Function to load selected report to crystal report viewer
public void FillReport(CrystalDecisions.CrystalReports.Engine.ReportClass oReport) 
{
    MyCrystalReportViewer.ReportSource = oReport;
    MyCrystalReportViewer.ShowPrintButton = true;
}

//Function for dispose crystal report viewer object 
public void ClearReportViewer()
{
    MyCrystalReportViewer.ReportSource = null;
    MyCrystalReportViewer.Dispose();            
}

1 Ответ

0 голосов
/ 15 ноября 2018

Я предполагаю, что настоящая проблема здесь - исключение.Память обрабатывается GC.Вероятно, на неуправляемой стороне не так много всего, что касается delete или free, поэтому память в диспетчере задач, скорее всего, не изменится после освобождения нескольких байтов.

Кроме того, что я заметил, чтоэто исключение происходит только в том случае, если Crystal-Reports не может найти предоставленный вами отчет (-файл), аналогично FileNotFoundException.Предоставленная вами трассировка стека также показывает множество вызовов для различных внутренних CR-методов Load.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...