문제

내 코드에서 버튼을 클릭하면 진행률 표시 줄이 Marquee로 설정되고 배경 작업자가 호출되지만 배경 작업자가 진행되는 경우 진행률 표시 줄이 얼거나 사라집니다. Backag 모든 도움이 감사합니다. 감사!

    Private Sub btnOtherReport_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOtherReport.Click
        rvReport.ProcessingMode = ProcessingMode.Remote
        rvReport.ShowParameterPrompts = False
        rvReport.ServerReport.ReportServerUrl = New Uri("REPORT_SERVER_URL")
        rvReport.ServerReport.ReportPath = "REPORT_PATH"
        rvReport.BackColor = Color.White

        BackgroundWorker1.RunWorkerAsync()
    End Sub


    Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        RefreshReport()
    End Sub


    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        pbReports.Style = ProgressBarStyle.Blocks
        pbReports.Value = 100
    End Sub


    Public Sub RefreshReport()
        rvReport.BeginInvoke(New MethodInvoker(AddressOf rvReport.RefreshReport))
    End Sub
도움이 되었습니까?

해결책

문제는 전화 할 때입니다 .BeginInvoke() 당신의 RefreshReport() 방법. 그만큼 BackgroundWorker.DoWork() 메소드는 이미 다른 스레드에서 제기되었으므로 rvReport.RefreshReport(). 다음과 같아야합니다.

Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    rvReport.RefreshReport()
End Sub

실제로는 간단하고 Monitor 보고서 개체를 잠그고 재입국을 방지합니다.

지금 전화 할 때 .BeginInvoke() 보고서 프로세스가 시작되지만 전혀 차단되지 않으므로 DoWork() 할 방법. 바로 돌아옵니다. 이 시점에서 배경 노동자는 그것이 끝났다고 생각하므로 .RunWorkerCompleted() 진행률 표시 줄을 중지하는 방법.


의견을 바탕으로 rvReport 구성 요소 또는 간단한 데이터 액세스 클래스가 아닌 시각적 제어입니다. 이 경우 .NET의 시각적 컨트롤이 스레드 안전하지 않다는 것을 알아야하므로 절대 완료하는 데 몇 분 이상이 걸리는 직접 직접 수행하십시오. 당신이 뛰어 넘고 있던 후프 .BeginInvoke() 에서 RefreshReport() 방법은 장기 실행 기능을 호출하는 효과가 있습니다. 메인 UI 스레드에서.

이 문제를 해결하려면 예외가 발생하지 않지만 (간단하지만 권장하지 않음) 크로스 스레드 점검을 끄거나 컨트롤 사용 방법을 변경하여 주요 작업이 다른 곳에서 발생하고 제어가 발생하면 이벤트가 발생하면 이벤트가 발생합니다. 상황이 준비되었습니다. 컨트롤을 그 정도까지 수정할 수 없다면 컨트롤의 설계 결함입니다.

다른 팁

문제는 배경 Thead에 프로세서가있는 동안 진행률 표시 줄에 다시 칠할 기회가 없다는 것입니다. 따라서 처리 중에 메인 대기 스레드에서 System.Windows.Forms.Application.Doevents ()를 호출해야합니다. 이로 인해 제어가 발생하여 진행률 표시 줄이 다시 칠됩니다.

따라서 BackgroundWorker1.RunWorkerAsync 호출 후 이벤트가 제기 될 때까지 Doevents를 호출하는 루프를 추가 한 다음 RunworkerCompleted에서 이벤트를 제기하여 호출 코드가 종료 될 수 있습니다. 이렇게하면 기본 코드가 계속 실행되지 않으므로 통화를 배경 통화 또는 다른 스레드에 넣을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top