CrystalReportViewer.RefreshReport लटकी हुई चल रहा है जब से BackgroundWorker

0

सवाल

मैं कोशिश कर रहा हूँ करने के लिए "वृद्धि" मेरी रिपोर्टिंग कोड जोड़ने के द्वारा एक लोडिंग स्क्रीन, जबकि क्रिस्टल रिपोर्ट तैयार की जा रही है/भरी हुई है. इससे पहले कि मैं कोशिश कर रहा शुरू करने के लिए जोड़ें लोड हो रहा है स्क्रीन, सभी की रिपोर्ट आ जाएगा बस ठीक है, लेकिन कर्सर परिवर्तन बस नहीं था "पर्याप्त" के लिए एक संकेत है कि गया था, आवेदन अभी भी काम पर खींच रिपोर्ट - उनमें से कुछ एक समय लग सकता है - तो मैं चाहता था प्रदान करने के लिए एक अधिक "स्पष्ट" दृश्य संकेत है.

आदेश में यह पूरा करने के लिए, मैं डाल दिया है रिपोर्ट के निर्माण विधि कॉल में एक BackgroundWorker में मौजूद है कि लोड हो रहा है स्क्रीन ही (मैं नहीं मिल गया है चारों ओर करने के लिए सीखने का उपयोग कैसे करें Async/Await काफी अच्छी तरह से अभी तक आरामदायक महसूस करने के लिए कि का उपयोग कर के बजाय). लोड हो रहा है स्क्रीन के ऊपर आता है और सही ढंग से सब कुछ प्रकट होता है काम करने के लिए उम्मीद के रूप में जब तक यह वास्तव में प्रयास रिपोर्ट प्रदर्शित करने के लिए स्क्रीन पर. उस बिंदु पर,"कृपया प्रतीक्षा करें जब तक दस्तावेज़ प्रसंस्करण है." बॉक्स के ऊपर आता है (में CrystalReportViewer नियंत्रण के रूप में इस्तेमाल किया, प्रदर्शित करने के लिए रिपोर्ट), लेकिन यह सिर्फ वहाँ बैठता है, नहीं भी कताई. अंत में, अपने आईडीई एक त्रुटि फेंकता प्राप्त करने के बारे में एक ContextSwitchDeadlock और मैं बहुत ज्यादा सिर्फ है रद्द करने के लिए निष्पादन.

यहाँ मेरी dlgReportLoading "छप स्क्रीन" के साथ एक PictureBox नियंत्रण शामिल है कि एक एनिमेटेड GIF:

Imports System.Windows.Forms

Public Class dlgReportLoading
    Private DisplayReport As Common.CRReport
    Private WithEvents LoadReportWorker As System.ComponentModel.BackgroundWorker

    Public Sub New(ByRef Report As Common.CRReport)
        InitializeComponent()
        DisplayReport = Report
    End Sub

    Private Sub dlgReportLoading_Load(sender As Object, e As EventArgs) Handles Me.Load
        Me.Cursor = Cursors.WaitCursor
        Me.TopMost = True
        Me.TopMost = False

        LoadReportWorker = New System.ComponentModel.BackgroundWorker
        LoadReportWorker.RunWorkerAsync()
    End Sub

    Private Sub dlgReportLoading_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
        Me.Cursor = Cursors.Default
    End Sub

    Private Sub LoadReport_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles LoadReportWorker.DoWork
        If Not DisplayReport.ReportOption = Common.CRReport.GenerateReportOption.None Then
            Select Case DisplayReport.ReportOption
                Case Common.CRReport.GenerateReportOption.DisplayOnScreen
                    '-- This is the method I'm currently testing
                    DisplayReport.ShowReport()
                Case Common.CRReport.GenerateReportOption.SendToPrinter
                    DisplayReport.PrintReport()
                Case Common.CRReport.GenerateReportOption.ExportToFile
                    DisplayReport.ExportReport()
            End Select
        End If

        DisplayReport.ReportOption = Common.CRReport.GenerateReportOption.None

        '--
        '-- This code was in use before trying to generate the reports in the background
        'If Not DisplayReport.CrystalReport Is Nothing Then
        '    DisplayReport.CrystalReport.Dispose()
        'End If
        '--
    End Sub

    Private Sub LoadReport_Complete(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles LoadReportWorker.RunWorkerCompleted
        Me.DialogResult = DialogResult.OK
        Me.Close()
    End Sub
End Class

के रूप में उल्लेख किया ऊपर कोड, मैं वर्तमान में परीक्षण ShowReport() विधि के रूप में यहाँ परिभाषित किया गया:

        Protected Friend Sub ShowReport()
            Dim ReportViewer As frmReportPreview

            Me.PrepareReport()
            ReportViewer = New frmReportPreview(Me)

            With ReportViewer
                .WindowState = FormWindowState.Maximized
                .Show()
            End With
        End Sub

और frmReportPreview इस प्रकार है:

Imports System.ComponentModel

Public Class frmReportPreview
    Private DisplayReport As Common.CRReport
    Private ReportToDisplay As CrystalDecisions.CrystalReports.Engine.ReportDocument

    Public Sub New(ByRef Report As Common.CRReport)
        InitializeComponent()

        DisplayReport = Report
        PrepareReportForDisplay()

        Me.rptViewer.ReportSource = Nothing
        Me.rptViewer.ReportSource = ReportToDisplay

        ' SET ZOOM LEVEL FOR DISPLAY:
        '    1 = Page Width
        '    2 = Whole Page
        '    25-100 = zoom %
        Me.rptViewer.Zoom(1)
        Me.rptViewer.Show()
    End Sub

    Private Sub frmReportPreview_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        '-- HANGS HERE
        Me.rptViewer.RefreshReport()
    End Sub

    Private Sub frmReportPreview_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
        ReportToDisplay.Dispose()
        Me.rptViewer.ReportSource = Nothing
    End Sub
    
    '...CODE FOR PREPARING THE REPORT TO BE DISPLAYED
End Class

के dlgReportLoading फार्म चबूतरे सही ढंग से और एनीमेशन निभाता है जब तक frmReportPreview चबूतरे के सामने यह (यह बंद नहीं करता). छोटे से बॉक्स है कि क्या सामान्य रूप से एक एनिमेटेड कताई चक्र का संकेत रिपोर्ट डेटा लोड किया जा रहा है प्रकट होता है, लेकिन लगभग तुरंत जमा देता है जगह में.

मैं एक ब्रेकप्वाइंट में LoadReport_DoWork() विधि के dlgReportLoading फार्म के बाद कॉल करने के लिए ShowReport() विधि, लेकिन यह कभी नहीं हो जाता है कि बात करने के लिए. मैं भी एक में LoadReport_Complete() विधि के रूप में है कि है कि यह कभी नहीं हिट तो और है कि संवाद वास्तव में कभी नहीं बंद कर देता है.

मैं डाल दिया है एक और ब्रेकप्वाइंट के अंत में frmReportPreview_Shown विधि, अधिकार के बाद Me.rptViewer.RefreshReport() कॉल, लेकिन यह कभी नहीं है कि हिट, तो यह स्पष्ट लगता है, जहां यह है कि बातें कर रहे हैं अटक रही है, लेकिन केवल जब इस रिपोर्ट उत्पन्न किया जा रहा है के माध्यम से BackgroundWorker. अगर मैं सिर्फ कॉल ShowReport() विधि के बिना इसे भेजने के माध्यम से "छप स्क्रीन" और BackgroundWorker, सब कुछ उत्पन्न करता है और प्रदर्शित करता है सामान्य रूप से ।

मैंने कोशिश की है डाल RefreshReport() विधि में अपने स्वयं के BackgroundWorker कोई परिवर्तन नहीं के साथ व्यवहार में. मैंने कोशिश की है बनाने के frmReportPreview वस्तु प्रदर्शन modally के साथ ShowDialog() के बजाय सिर्फ Show(). इस में से कोई भी लगता है मदद करने के लिए इस मुद्दे को.

मैं एक लग रहा है कुछ किया जा रहा है का निपटारा भी जल्दी में कहीं है, लेकिन मैं बाहर आंकड़ा नहीं कर सकते कि क्या होगा. मैं प्रदान कर सकते हैं बाकी रिपोर्ट की तैयारी कोड से frmReportPreview यदि आवश्यक हो, लेकिन यह सब लगता है काम करने के लिए त्रुटि के बिना, के रूप में दूर के रूप में मैं कर सकते हैं बता. मैं कर रहा हूँ गुरेज नहीं की कोशिश कर के लिए वैकल्पिक तरीकों को पूरा करने के अपने लक्ष्य को दिखाने के लिए उपयोगकर्ता के लिए एक लोडिंग स्क्रीन, जबकि सभी रिपोर्ट की तैयारी जगह ले जा रहा है - उदाहरण के लिए, Async/Await या अन्य बहु सूत्रण तरीकों में से एक - तो किसी भी सुझाव का स्वागत करते हैं । कृपया मुझे पता है अगर किसी भी अतिरिक्त स्पष्टीकरण की जरूरत है.


पर्यावरण

माइक्रोसॉफ्ट विंडोज 10 प्रो 21H1 (ओएस का निर्माण 19043.1348)
माइक्रोसॉफ्ट विजुअल स्टूडियो समुदाय 2017 (v15.9.38)
Crystal रिपोर्ट के लिए .NET Framework v13.0.3500.0 (रनटाइम संस्करण 2.0.50727)


संपादित करें: मैं उल्लेख करना भूल गया है कि इस सारी गंदगी बुलाया जा रहा है से एक GenerateReport() विधि में CRReport वर्ग के रूप में परिभाषित किया गया:

Public Sub GenerateReport(ByVal ReportGeneration As GenerateReportOption)
    Me.ReportOption = ReportGeneration

    If Me.ReportOption = GenerateReportOption.None Then
        '...CODE FOR REQUESTING A GENERATION OPTION FROM THE USER
    End If

    Dim ReportLoadingScreen As New dlgReportLoading(Me)

    ReportLoadingScreen.ShowDialog()
End Sub

जो, बारी में बुलाया जा रहा है से मुख्य रूप से इस तरह:

Private Sub PrintMyXMLReport(ByVal XMLFile As IO.FileInfo)
    Dim MyXMLReport As New IO.FileInfo("\\SERVER\Applications\Reports\MyXMLReport.rpt")
    Dim Report As New Common.CRReport(MyXMLReport, XMLFile)
    
    Report.GenerateReport(Common.CRReport.GenerateReportOption.DisplayOnScreen)
End Sub
1

सबसे अच्छा जवाब

1

आप अलग होना चाहिए भारी उठाने और यूआई के संचालन में अलग-अलग तरीकों क्रम में उन्हें डाल करने के लिए उचित BackgroundWorker घटनाओं:

Protected Friend Sub PrepareReport()
    ' perform long-running background work
End Sub

Protected Friend Sub ShowReport()
    Dim ReportViewer = New frmReportPreview(Me) With {.WindowState = FormWindowState.Maximized}
    ReportViewer.Show()
End Sub
Private DisplayReport As Common.CRReport

Private Sub LoadReport_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles LoadReportWorker.DoWork
    DisplayReport.PrepareReport()
End Sub

Private Sub LoadReport_Complete(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles LoadReportWorker.RunWorkerCompleted
    DisplayReport.ShowReport()    
    Me.DialogResult = DialogResult.OK
    Me.Close()
End Sub

क्योंकि LoadReport_DoWork वास्तव में रन पर एक नया गैर-यूआई धागा, और LoadReport_Complete पर चलाता है, फोन करने वाले का धागा है, जो एक यूआई धागा । केवल वहाँ आप कर सकते हैं के साथ बातचीत यूआई और दिखाने के रूपों आदि ।

2021-11-18 21:49:28

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में