我試圖在for循環中創建圖片框,然後將它們添加到我的主窗體中。我在另一個線程中創建圖片框來減少加載時間,但是我的應用程序不斷崩潰。從線程添加圖片框到窗體
我將代碼更改了10次,實際版本看起來像這樣。
Private letters() As PictureBox
Private Sub loadLetters()
Dim j As Integer = 0
letters = New PictureBox() {}
For value As Integer = 0 To 7
letters(value).Image = ImageList1.Images(value + 8)
letters(value).Name = "picLetter_" & value + 8
letters(value).Location = New Point(0, j)
letters(value).Size = New Size(100, 100)
letters(value).Visible = True
j = j + 100
Me.BeginInvoke(New MethodInvoker(AddressOf loadLetters))
Next
End Sub
我的另一個嘗試把我帶到這個:
If Me.InvokeRequired Then
Dim d As New updateMain(AddressOf loadLetters)
Me.Invoke(d, New Object() {letters(value)})
Else
Me.Controls.Add(letters(value))
End If
Private Delegate Sub updateMain(ByVal picture As PictureBox)
如何從另一個線程添加圖片框的主要形式?
您無法在非UI線程上創建控件。所有UI元素都必須在UI線程上創建,否則會出錯。你可以在後臺線程上做的唯一事情就是非UI處理或加載數據。你爲什麼試圖在後臺線程上創建它們? – Enigmativity
@Enigmativity:你錯了。我只是測試了他和我的代碼(在他的最後幾次初始化修正之後),並且從另一個線程(我正在使用.NET 4.0)完全正常工作。由於它們作爲變量添加到數組中,因此可以從任何線程訪問該數組,因爲它們尚未添加(也未用於)任何容器。 –
@VisualVincent - 對不起,您可以從非UI線程創建儘可能多的UI元素,只要不將它們附加到顯示的UI容器即可。 – Enigmativity