Почему мой индикатор выполнения исчезает? - PullRequest
1 голос
/ 30 августа 2011

Я видел эту проблему раньше, но я не видел ответа на вопрос, относящийся к моему конкретному случаю.В моей форме VB запущен BackgroundWorker, а также индикатор выполнения и некоторые ярлыки.У меня также (если это важно) есть веб-браузер в моей форме, но поток не влияет на него.

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

    Dim ints As Integer = Int(InputBox("What number to start at?"))
    Dim inte As Integer = Int(InputBox("What number to end at?"))
    ToolStripStatusLabel1.Text = "0 / " & inte - ints
    ToolStripProgressBar1.Maximum = inte
    ToolStripProgressBar1.Minimum = ints
    ToolStripProgressBar1.Style = ProgressBarStyle.Continuous
    Try
        For z As Integer = ints To inte

            ToolStripProgressBar1.Value = z
            ToolStripStatusLabel1.Text = z & "/" & inte
            'do some stuff here
    catch etc
    next

Когда цикл выполняется, иногда он останавливается и индикатор выполнения исчезает.Есть идеи почему?Кстати, единственное, что я там делаю, - это запуск httpwebrequest и обработка строки.

1 Ответ

2 голосов
/ 30 августа 2011

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

Согласно примечанию на этой странице MSDN :

Вы должны быть осторожны, чтобы не манипулировать объектами пользовательского интерфейса в ваш обработчик событий DoWork. Вместо этого, общаться с пользовательским интерфейсом через события ProgressChanged и RunWorkerCompleted.

События BackgroundWorker не маршалируются через границы AppDomain. Не используйте компонент BackgroundWorker для выполнения многопоточных операции в нескольких доменах приложений.

Что вам нужно сделать, это изменить код внутри цикла (For z As Integer = ints To inte), чтобы вместо прямой установки свойств Value и Text вы вызывали BackgroundWorker ReportProgress метод. Это вызывает событие ProgressChanged, которое затем можно обработать в главном потоке пользовательского интерфейса. Именно здесь вы можете безопасно получить доступ к свойствам компонентов и объектов пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...