DoHeavyWork() 하위 함수를 실행하는 BackgroundWorker가 있습니다. 이 하위 기능 DoHeavyWork() 내부 BackgroundWorker가 다른 폼에서 GUI를 업데이트하지 않습니다.
Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
ProgressBar1.Value = e.ProgressPercentage
Label8.Text = e.ProgressPercentage.ToString() + " %"
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
If e.Cancelled = True Then
ProgressBar1.Value = 0
Label8.Text = ""
ElseIf e.Error IsNot Nothing Then
MessageBox.Show(e.Error.Message)
Else
MessageBox.Show("Completed!")
End If
End Sub
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
If BackgroundWorker1.CancellationPending = True Then
e.Cancel = True
Else
'DO HEAVY WORK
DoHeavyWork()
End If
End Sub
, 또 다른 형태의 GUI를 업데이트하는 코드가있다.
Private Sub DoHeavyWork()
For i As Integer = 1 To fresult_counter
Dim fresult As New Button
fresult.Name = "fresult_" & i
fresult.Text = result(index_acc(i - 1)).ToString
fresult.TextAlign = ContentAlignment.MiddleLeft
fresult.Width = 265
fresult.AutoSize = True
fresult.BackColor = Color.White
With fresult.FlatAppearance
.BorderColor = Color.White
.BorderSize = 2
.MouseDownBackColor = Color.DeepSkyBlue
.MouseOverBackColor = Color.DeepSkyBlue
End With
fresult.Anchor = AnchorStyles.Left
fresult.FlatStyle = FlatStyle.Flat
fresult.UseVisualStyleBackColor = False
fresult.Location = New Point(0, 22 * (i - 1))
Form1.TabControl2.TabPages(1).Controls.Add(fresult)
BackgroundWorker1.ReportProgress(i)
Next
End Sub
문제는 진행률 표시 줄이 작동하는 GUI 만 업데이트되지 않은 것입니다. BackgroundWorker 밖으로 코드 집합을 얻으려고했는데 제대로 작동합니다. BackgroundWorker가 GUI를 업데이트 할 수 있도록 설정하지 않은 것이 있습니까?
다른 스레드에 있기 때문입니다. 진행률 표시 줄은 UI 스레드에 없기 때문에 작동합니다. 다른 참가자는 아마도 ... 대리인을 살펴보고 호출하면 필요한 것을 찾을 수 있습니다. 또한 문제의 주요 코드를 남겨 두는 것은 아마도 DoHeavyWork에있는 것입니다. 아마도 컨트롤을 변경하려고하는 것일 수도 있습니다. – Codexer
조언을 주셔서 감사합니다. – jwen
'BackgroundWorker'사용에 대한 연구는 거의하지 않은 것 같습니다. 요점은 배경 작업을하는 것입니다. UI와 관련이있는 것은 배경 작업과 정반대입니다. 귀하의 경우, 당신이하고있는 모든 일은 UI를 포함하므로, 우리는'BackgroundWorker '를 전혀 사용할 수 없습니다. – jmcilhinney