一千萬個為什麽

搜索

ProgressBar在使用多線程時會凍結

當生成報表時,我有一個使用選取框樣式的ProgressBar。我這樣做的原因是因為我使用的ReportViewer控件需要一些時間來生成報表,從而導致表單無響應。我使用線程生成報告,以便ProgressBar可以顯示程序正在工作。但是,當我啟動線程時,ProgressBar會凍結。我已經嘗試過BackgroundWorker,但那不起作用,所以我使用了自己的線程。

我使用Invoke()方法的原因是因為我無法對我創建的線程上的ReportViewer控件進行更改,因為它是在UI線程上創建的。

需要大部分時間處理的方法是ReportViewer控件的RefreshReport()方法,這就是為什麽我要在自己的線程而不是UI線程上執行此操作的原因。

任何幫助,將不勝感激。謝謝。

這是我的線程變量的代碼:

Private t As New Thread(New ParameterizedThreadStart(AddressOf GenerateReport))

以下是生成報告的按鈕的代碼:

Private Sub btnGenerateReport_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGenerateReport.Click
    pbReports.Style = ProgressBarStyle.Marquee

    If t.ThreadState = ThreadState.Unstarted Then
        t.IsBackground = True
        t.Start(ReportType.Roads)
    ElseIf t.ThreadState = ThreadState.Stopped Then
        t = Nothing
        t = New Thread(New ParameterizedThreadStart(AddressOf GenerateReport))
        t.IsBackground = True
        t.Start(ReportType.Roads)
    End If
End Sub

以下是生成報告的代碼:

Public Sub GenerateReport(ByVal rt As ReportType)
    If rvReport.InvokeRequired Then
        Dim d As New GenerateReportCallBack(AddressOf GenerateReport)
        Me.Invoke(d, New Object() {rt})
    Else
        rvReport.ProcessingMode = ProcessingMode.Remote
        rvReport.ShowParameterPrompts = False
        rvReport.ServerReport.ReportServerUrl = New Uri("My_Report_Server_URL")
        rvReport.ServerReport.ReportPath = "My_Report_Path"
        rvReport.BackColor = Color.White

        rvReport.RefreshReport()
    End If

    If pbReports.InvokeRequired Then
        Dim d As New StopProgressBarCallBack(AddressOf StopProgressBar)
        Me.Invoke(d)
    Else
        StopProgressBar()
    End If
End Sub

最佳答案

你的代碼是從UI線程開始一個新的線程。然後新的線程立即用Invoke編組回到UI線程 - 所以基本上就好像你沒有完成多線程一樣。

取而代之的是,讓新線程執行所有可以進行的後臺處理,並且僅將需要更新界面的部分過程回傳給用戶界面。

轉載註明原文: ProgressBar在使用多線程時會凍結