我是线程世界的新手,但我正在开发的应用程序的某些方面要求我使用 BackgroundWorker 控件来防止 UI 在执行某些文件操作时冻结。
我要做的是从 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 的原因是为了确保 UI 在我执行文件操作时保持响应。问题是,我仍然需要等到 BackgroundWorker 完成它的工作,这样我才能返回一个指示操作成功的布尔值。有一些方法可以解决这个问题,但从我的阅读来看,不得不等待 BackgroundWorker 完成其工作,这违背了使用它的初衷。那么,防止 UI 锁定的最佳方法是什么?