我对visual basic有点生疏,但是我需要将它用于我正在开发的需要.NET语言的项目。
我注意到在编写一些代码来更新windows fourm应用程序中文本框的文本值时
'weve read the stuff...now lets update the textbox with the ADC value
DataQSingleDevice.GetInterleavedBinaryData(BinaryData, 0, 18)
DataQSingleDevice.Stop()
DATAQHandler(0).Disconnect()
'now lets throw data in the textbox
Button1.Text = "Connected!"
For incramenter As Integer = 0 To 10
TextBox1.Text = BinaryData(incramenter)
Threading.Thread.Sleep(2000)
Next
end sub
当我在上面经历这个for循环时,它不会在每次迭代时更新文本值。我认为这意味着它只能在此子所在的方法完成后才能执行。
我记得在Java中的Android编程中,像这样的属性修改通常在主要UI线程上实现,这个线程深埋在一个永无止境的循环中,只有GOD本人和java语言的发明者才能找到它。我还记得像AsyncTask<>这样的方法。和Java.util.concurrent允许我在后台线程上执行操作并更新某些视图。
My question:
有没有办法在GUI上更新visualBasic中的东西属性,比如“TextBox1.Text”,类似于Android编程中的某些视图可以定期用后台线程更新? (这个过程可能需要几分钟的更新......这个例子只持续20秒,但我的实际使用时间可能会持续10分钟)
答案 0 :(得分:0)
实际上,有一种从另一个线程访问UI的正确方法。你应该这样做:
TextBox1.Invoke(Sub() TextBox1.Text = BinaryData(incramenter))
或
TextBox1.BeginInvoke(Sub() TextBox1.Text = BinaryData(incramenter))
而不是:
TextBox1.TextBox1.Text = BinaryData(incramenter)
.Invoke
和.BeginInvoke
之间的区别在于第一个将同步运行,也就是说,当前线程将等待lambda子中的操作在UI线程中完全执行,然后才会会继续。后者将发送lambda子进程在UI线程中执行而不等待它运行,因此调用者线程立即进行。由您决定更适合您的那个。