vb.net - 如何在新线程中修改文本框值
问题描述
我有这个子:
Public Sub obtenerValorDeFichero()
Dim ruta As String
ruta = "file.txt"
Dim myFile As New FileInfo(ruta)
Dim sizeInBytes As Long = myFile.Length
While (Convert.ToInt32(sizeInBytes.ToString) < 4)
myFile.Refresh()
sizeInBytes = myFile.Length
End While
Threading.Thread.Sleep(500)
Me.TextBox3.Text = File.ReadAllText(ruta).Trim
End Sub
我通过这种方式在新代码中调用它:
Dim myThread As System.Threading.Thread
myThread = New System.Threading.Thread(Sub() obtenerValorDeFichero())
myThread.Start()
但是当尝试更改 Me.Textbox3.Text 值时它会崩溃,我该怎么做?
解决方案
我使用这种方法从创建它的线程以外的线程更新 TextBox。
Private Delegate Sub SetTextBoxDelegate(ByVal TB As TextBox, ByVal txt As String)
Private Sub SetTextBoxWithInvoke(ByVal TB As TextBox, ByVal txt As String)
If TB.InvokeRequired Then
TB.Invoke(New SetTextBoxDelegate(AddressOf SetTextBoxWithInvoke), New Object() {TB, txt})
Else
TB.Text = txt
End If
End Sub
然后在obtenerValorDeFichero()
你可以更换
Me.TextBox3.Text = File.ReadAllText(ruta).Trim
和
SetTextBoxWithInvoke(Me.TextBox3, File.ReadAllText(ruta).Trim)
问候。
推荐阅读
- c# - 使用 observable 按字母顺序排序数据
- java - NPE 很难从 logcat 中发现它似乎是 Arraylist 但应该设置每个项目
- docker - Docker 拒绝挂载 NFS 共享
- sql - Laravel Eloquent:选择一个字段等于另一个字段的记录
- google-apps-script - 继续接收 抱歉,无法删除所有未冻结的行
- angular - angular: 封装一个 Stepper 组件
- python - Python:为什么 for 循环在 join() 函数的中间?
- java - Spring WebClient - 如何处理错误场景
- python - 我的神经网络的准确性很差
- wordpress - 在产品上方的 Woocommerce 类别中显示热门内容