VB.NET Delegates and Invoke - czy ktoś może mi to wyjaśnić?

Jestem nowicjuszem w świecie wątków, ale kilka aspektów aplikacji, nad którą pracuję, wymaga użycia kontrolki BackgroundWorker, aby zapobiec zawieszaniu się interfejsu użytkownika podczas wykonywania niektórych operacji na plikach.

Próbuję zaktualizować kilka etykiet formularzy z poziomu BackgroundWorker. Nigdy wcześniej nie pracowałem nad tym, zanim bardzo szybko odkryłem, że nie mogę uzyskać dostępu do elementów sterujących, które nie zostały utworzone w tym samym wątku, więc po odrobinie badań zaimplementowałem następujący kod, który sprawia, że ​​wszystko działa:

Private Delegate Sub DelegateUpdateStatus(ByVal statusText As String, ByRef currentFile As String)

Private Sub UpdateStatus(ByVal statusText As String, ByVal currentFile As String)

    If InvokeRequired Then
        Invoke(Sub() LblStatus.Text = statusText)
        Invoke(Sub() LblCurrentFile.Text = currentFile)
    Else
        LblStatus.Text = statusText
        LblCurrentFile.Text = currentFile
    End If

End Sub

Rzecz w tym, że nie rozumiem, co robi ten kod ani dlaczego jest wymagany.

Zrobiłem trochę badań, ale nie zrobiłem żadnej prawdziwej pracy z takimi rzeczami, a większość przeczytanych artykułów zakłada jakąś wcześniejszą wiedzę.

Trzy główne rzeczy, które chcę zrozumieć:

Dlaczego ten kod jest wymagany (jak w, dlaczego formanty nie mogą być dostępne bezpośrednio z BackgroundWorker)Czym jest delegat i kiedy wymagane jest jego użycieCo robi metoda Invoke i czego sprawdzam za pomocą InvokeRequired

Jak już wspomniano, wątkowanie jest nadal dość obcą koncepcją, więc wszelkie odpowiedzi w prostym języku angielskim byłyby bardzo pomocne - dzięki!

EDIT: Dzięki za odpowiedzi do tej pory wszyscy. Zrobiłem trochę dalszej lektury i zastanawiam się, czy zamierzam to zrobić we właściwy sposób. Powodem, dla którego używam BackgroundWorker, jest upewnienie się, że interfejs użytkownika pozostaje responsywny podczas wykonywania operacji na plikach. Problem polega na tym, że nadal muszę czekać, aż BackgroundWorker wykona swoje zadanie, więc mogę zwrócić wartość logiczną wskazującą na powodzenie operacji. Są sposoby na obejście tego problemu, ale po przeczytaniu, czekanie na BackgroundWorker, aby ukończył swoją pracę, w pierwszej kolejności pokonuje cel jej używania. Jaki jest najlepszy sposób na zapobieganie blokowaniu interfejsu użytkownika?

questionAnswers(3)

yourAnswerToTheQuestion