Как передать текстовый параметр в ProgressChanged? - PullRequest
3 голосов
/ 31 июля 2011

Я новичок в VB.Net, и мне нужно написать длительный процесс с циклом while / end while.

Чтобы избежать зависания пользовательского интерфейса, я добавил в форму объект BackgroundWorker.

Затем мне нужно было обновить интерфейс, но я обнаружил, что поток не может этого сделать.Вместо этого поток должен вызвать ReportProgress (), чтобы вызвать событие ProgressChanged ().

Однако мне нужно передать текст из исключения (ex.Message) в событие, но я не нашел примеро том, как это сделать.Мне нужно это текстовое сообщение для обновления строки заголовка формы.

Вот код:

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    While (True)
        Try
            ...
        Catch ex As Exception
            'Cross-thread operation not valid: Control 'Form1' accessed from a thread other than the thread it was created on.
            'Me.Text = ex.Message

            BackgroundWorker1.ReportProgress(100)
        End Try

        System.Threading.Thread.Sleep(2000)
    End While
End Sub

Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged

        'How to get ex.Message, and change the form's title bar accordingly?
        'Me.Text = ???
End Sub

Спасибо.


Редактировать: Вот как получитьпередать сообщение об ошибке событию и изменить текст заголовка формы:

        Catch ex As Exception
            BackgroundWorker1.ReportProgress(100, ex.Message)
        End Try

        System.Threading.Thread.Sleep(2000)
    End While
End Sub

Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    Me.Text = e.UserState.ToString
End Sub

1 Ответ

4 голосов
/ 31 июля 2011

Метод Reportprogress имеет перегрузку , которая принимает Int32 и параметр Object.Вы можете передать сообщение или полное исключение в основную ветку.

В событии ProgressChanged вы можете получить его из свойства UserState.

...