BackgroundWorker.ReportProgress исключение, если выполняется в другом модуле - PullRequest
1 голос
/ 19 марта 2012

Мой BackgroundWorker отлично работает в моей основной форме frmMain. Но когда я запускаю метод ReportProgress в другом модуле, я получаю исключение «Этот BackgroundWorker заявляет, что он не сообщает о прогрессе. Измените WorkerReportsProgress, чтобы заявить, что он сообщает о прогрессе». Это установлено, чтобы сообщить о прогрессе; это работает нормально, если в главном модуле выполняется то же самое.

По сути, из модуля, вызываемого моим BackgroundWorker, я хочу показать прогресс в моей основной форме.

Как я могу это исправить? Единственная идея, которую я имею, состоит в том, чтобы переместить код из модуля в мою основную форму, но это кажется шагом назад, который потребует дополнительной работы. Надеюсь, есть более простые способы!

Телефонный код в классе frmMain:

Friend WithEvents BackgroundWorker As New System.ComponentModel.BackgroundWorker

Private Sub btnTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTest.Click
    ' Specify that we do NOT want the background operation to allow cancellation
    BackgroundWorker.WorkerSupportsCancellation = False
    ' Specify that we want the background operation to report progress.
    BackgroundWorker.WorkerReportsProgress = True
    ' Start running the background operation by calling the RunWorkerAsync method.
    BackgroundWorker.RunWorkerAsync()
End Sub

Private Sub BackgroundWorker_DoWork(ByVal sender As Object, _
        ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker.DoWork
    Dim result As Boolean
    result = MyTest()
End Sub

Private Sub BackgroundWorker_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker.ProgressChanged
    Me.Text = e.ProgressPercentage.ToString() & "%"
    sspStatus.Text = e.UserState.ToString
End Sub

Private Sub BackgroundWorker_RunWorkerCompleted(ByVal sender As Object, _
        ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) _
        Handles BackgroundWorker.RunWorkerCompleted
    If e.Cancelled = True Then
        '  The background operation was cancelled
        Me.Text = "Cancelled!"
    ElseIf e.Error IsNot Nothing Then
        '  The background operation encountered an error
        Me.Text = "Error: " & e.Error.Message
    Else
        '  The background operation completed successfully
        Me.text = "Done!"
    End If
End Sub

Код, который генерирует исключение в отдельном модуле Счета:

Public Function MyTest() As Boolean
    frmMain.BackgroundWorker.ReportProgress(0)
End Function

Использую VB.NET в VS 2010, с .NET 3.5.

1 Ответ

0 голосов
/ 19 марта 2012

Попробуйте установить его как

Public Function MyTest(worker as BackgroundWorker) As Boolean
    worker.ReportProgress(0)
End Function

чтобы убедиться, что вы разговариваете с нужным рабочим экземпляром.

(И в сторону: избегайте использования имен классов для полей экземпляров).

...