2017-10-11 85 views
1

對於visual basic我有點生疏,但是我需要將它用於我正在開發的項目,這需要.NET語言。Visual Basic在後臺線程上更新GUI .text屬性

我寫一些代碼在Windows4米應用程序更新一個文本框的文本值時注意到

'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線程中實現,這個線程深埋在一個永無止境的循環中,只有上帝自己和Java語言的發明者才能希望找到。我還記得像AsyncTask <>和Java.util.concurrent這樣的方法允許我在後臺線程上執行某些操作並更新某些視圖。

My question:

有沒有一種方法來更新GUI上,如在VisualBasic中事物的性質「TextBox1.Text」相似,如何在Android的編程的一些觀點可以與後臺線程定期更新? (這個過程可能會持續幾分鐘的更新......這個例子只持續20秒,但我的實際使用可能持續10分鐘)

+2

如果這是在後臺線程中運行,則必須調用BeginInvoke來強制更新發生在UI線程上。 – dwilliss

回答

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線程中執行而不等待它運行,因此調用者線程立即進行。它取決於你選擇一個更適合你的那個。

+0

我會做一個後臺線程,並嘗試這個怪胎! –