如何使用委托从后台工作人员更新富文本框

How to update a rich text box from a background worker using a delegate

好的,我对使用线程还很陌生,但到目前为止,我已经设法获得以下内容:

Private Delegate Sub dlgUpdateText(text as string)

Private Sub UpdateStatus(text as string)
  If rtxStatus.InvokeRequired then
    Dim dlg as new dlgUpdateText(AddressOf UpdateStatus)
    Me.Invoke(dlg, text)
  Else
    rtxStatus.text = text
  End If
End Sub

然后从我的 Async BackgroundWorker 调用

UpdateStatus("Some text") 

这似乎工作正常但是在我的原始代码中(由于我从错误的线程更新控件而产生错误)我使用以下代码附加到(rich)文本框:

rtxStatus.Select(rtxStatus.TextLength, 0)
rtxStatus.SelectionColor = Color.Red
rtxStatus.AppendText("Some error occurred gathering data")

我的问题是我应该如何修改我的新代码以允许我这样做而不是仅仅替换文本?我已经阅读了几本关于使用委托的指南,但我仍然迷失了几点,所以我真的不知道我的代码发生了什么。

奖金问题(这可能最能说明需要向我解释的内容!):

  1. Delegate Sub 实际上是做什么的?除了保存已经传递给主 Sub (UpdateStatus)?
  2. 的 属性(文本)外,它似乎没有任何其他用途
  3. 调用 Me.Invoke 时发生了什么?我是当前表单,所以当我传递 Delegate Sub 和文本时,它指定文本应传递给 rtxSTatus.Text 属性?
  4. UpdateStatus 运行s 在主线程中(?)并从后台工作线程之一调用,那么为什么 Invoke 甚至是必要的,或者是后台线程下的 UpdateStatus Sub 运行那叫它?当我更改 Else 语句中应用的文本以查看哪个是 运行 时,Invoke 似乎从未用于更改框中的文本。

非常感谢任何帮助,我对此感到非常困惑 - 谢谢!

我建议使用后台工作者提供的现有方法,而不是创建委托。 backgroundworker提供了两种访问主线程的方法:

ProgressChanged 事件用于在 backgroundworker 处理期间更新主线程,RunWorkerCompleted 事件用于在 backgroundworker 进程完成后更新主线程。

您可以从以下link找到此信息以及如何实施它:

http://msdn.microsoft.com/en-us/library/ywkkz4s1.aspx