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