Visual Basic在后台线程

时间:2017-10-11 17:39:38

标签: vb.net multithreading background-thread

我对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分钟)

1 个答案:

答案 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线程中执行而不等待它运行,因此调用者线程立即进行。由您决定更适合您的那个。