.net 如何将文本设置为在另一个线程中创建的元素

.net 如何将文本设置为在另一个线程中创建的元素,.net,vb.net,cross-thread,.net,Vb.net,Cross Thread,在开始之前,我知道这个问题已经有了很多答案,但让我解释一下发生了什么 我基本上希望将一些文本附加到RichTextBox元素,它对我来说就像一个记录器,用于通知用户文件处理中的每个操作,但是文本通过for循环附加到RichTextBox,如果我在同一类“Form1.vb”中执行此循环,UI将冻结,直到循环完成 我决定在一个单独的线程中运行循环,以避免UI冻结,我的问题就是从这里开始的 Form1.vb 导入系统线程 公开课表格1 模糊的神话被解读为线 私有子appendMyText() '跨线程

在开始之前,我知道这个问题已经有了很多答案,但让我解释一下发生了什么

我基本上希望将一些文本附加到RichTextBox元素,它对我来说就像一个记录器,用于通知用户文件处理中的每个操作,但是文本通过for循环附加到RichTextBox,如果我在同一类“Form1.vb”中执行此循环,UI将冻结,直到循环完成

我决定在一个单独的线程中运行循环,以避免UI冻结,我的问题就是从这里开始的

Form1.vb

导入系统线程
公开课表格1
模糊的神话被解读为线
私有子appendMyText()
'跨线程操作无效:从创建控件txtLogger的线程以外的线程访问控件txtLogger。
AppendText(“helloworld”和vbNewLine)
端接头
私有子btnTest\u Click(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理btnTest。单击
myThread=新线程(新线程开始(appendMyText的地址))
myThread.Start()
端接头
末级
我无法从另一个线程访问txtLogger元素,因此我尝试了MSDN示例

它向我展示了如何使用委托访问进行线程安全调用的元素

所以我编辑的代码是

Form1.vb

导入系统线程
公开课表格1
模糊的神话被解读为线
委托子AppendMyText(ByVal文本作为字符串)
'将文本添加到RichTextBox
私有子addText(ByVal txt作为字符串)
如果需要txtLogger.invoker,则
Dim myDelegate=新的AppendMyText(addText的地址)
调用(myDelegate,{txt})
其他的
AppendText(txt)
如果结束
端接头
'调用将文本添加到RichTextBox的方法
专用子线程安全()
Me.addText(“Hello World”和vbNewLine)
端接头
私有子btnTest\u Click(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理btnTest。单击
myThread=新线程(新线程开始(线程安全的地址))
myThread.Start()
端接头
末级
代码实际上是这样工作的,文本被附加到RichTextBox,但是所有代码都在同一个类Form1.vb中

在我最初的项目中,for循环在另一个类中执行,我将在这里将其命名为“Class1.vb”

这就是代码示例

Class1.vb

公共类1
公共子计数()
作为整数的Dim i
对于i=0到100
'此方法将由线程“myThread”执行
'如何从此处将文本附加到txtLogger?
WriteLine(“索引:{0}”,i)
下一个
端接头
末级

将表单引用传递给类

以你的形式

Dim MyClass as Class1
MyClass = New Class1(Me)
在你们班

Public Class Class1

     Private Parent_From as Form1
     Public Sub New(Parent as Form1)
           Parent_From = Form
     End sub
     Public Sub count()
        Dim i As Integer
        For i = 0 To 100
            ' this method will be executed by thread "myThread"
            Parent_Form.addTExt("Whatever")
            Debug.WriteLine("Index: {0}", i)
        Next
    End Sub
End CLass

您可以将表单作为参数传递给
count
方法。我已经尝试过这种方法。但是不建议直接从另一个线程访问元素,我知道为什么!我的项目需要追加200多次文本,当我将表单作为参数传递时,应用程序停止响应并崩溃,因为表单在它自己的线程上运行。通过表单访问自定义方法应该仍然是可能的,只要该方法调用对UI元素的访问。因此,调用
yourForm.addText()
后台线程中的yourForm.threadSafe()
不应该是问题。可能是您的线程试图以线程切换无法处理的速度更新它。。。。考虑将文本构建为缓冲字符串,定期更新UI,或者在结尾处进行。太好了!成功了!我已经尝试将表单作为参数传递,但忘记调用相同的方法来添加文本,而是使用.txtLogger.AppendText(“某物”)中的Parent_访问元素。。非常感谢你!