У меня возникают проблемы с обновлением графического интерфейса на разных потоках. Мой сценарий таков:Пытаясь обновить графический интерфейс внутри темы (начато с BackgroundWorker)
У меня есть основная форма с одним флажком. В событии я начинаю работу с фоновым работником. В событии BackgroundWorker_DoWork
я вызываю новый класс, который, в свою очередь, запускает новый поток. Из этого потока я пытаюсь установить Checked
состояние флажка в Form1, но без везения.
До сих пор у меня есть следующий код:
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
BackgroundWorker1.RunWorkerAsync()
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Try
Do While Not BackgroundWorker1.CancellationPending = True
Dim cl As New HandleClient
Me.Invoke(Sub() Checkbox1.Checked = True)
Loop
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
End Class
Public Class HandleClient
Public Sub startClient()
Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf start)
ctThread.Start()
End Sub
Private Sub start()
While (True)
Try
...
..
Catch ex As Exception
Form1.Invoke(Sub() Form1.Checkbox1.Checked = False) '<== Fails here
End Try
End While
End Sub
End Class
Я попытался с помощью THREADSAFE вызовов и настройки свойств через отдельный класс, но я либо получаю ошибку о том, что я не могу использовать BeginInvoke или Checkbox просто не обновляется (без ошибок).
Любая благодарная благодарность.
Что такое Class1? –
К сожалению, это был код, оставшийся от чего-то, что я пытался. Я попытался установить флаг из отдельного класса. Я обновил свой пост. – Riples
так почему вы создаете еще один новый поток внутри 'BackgroundWorker.DoWork'? переместите свою трудоемкую задачу туда, и она должна работать нормально – Plutonix