Делегаты VB.NET и Invoke - кто-нибудь может мне это объяснить?

Я новичок в мире многопоточности, но некоторые аспекты приложения, над которым я работаю, требуют от меня использования элемента управления BackgroundWorker для предотвращения зависания пользовательского интерфейса во время выполнения некоторых файловых операций.

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

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

Дело в том, что я не понимаю, что делает этот код или почему он требуется.

Я провел небольшое исследование, но я не проделал никакой реальной работы с такими вещами, и большинство статей, которые я прочитал, предполагают некоторые предварительные знания.

Три основные вещи, которые я хочу получить, чтобы понять:

Почему этот код требуется (например, почему элементы управления не могут быть доступны непосредственно из BackgroundWorker)Что такое делегат и когда требуется его использование?Что делает метод Invoke и что я проверяю с помощью InvokeRequired

Как уже говорилось, многопоточность все еще довольно чуждая концепция, поэтому любые ответы на простом английском языке будут очень полезны - спасибо!

РЕДАКТИРОВАТЬ: Спасибо за ответы, пока все. Я продолжил читать, и мне интересно, правильно ли я поступлю. Причина, по которой я использую BackgroundWorker, заключается в том, чтобы гарантировать, что пользовательский интерфейс остается отзывчивым, пока я выполняю файловые операции. Проблема в том, что мне все еще нужно подождать, пока BackgroundWorker выполнит свою работу, чтобы я мог вернуть логическое значение, указывающее на успешность операции. Есть способы обойти это, но из моего прочтения необходимость ждать, пока BackgroundWorker завершит свою работу, в первую очередь побеждает цель его использования. Итак, как лучше всего предотвратить блокировку пользовательского интерфейса?

Ответы на вопрос(3)

Ваш ответ на вопрос