我是 vb.net 的新手,并且使用不同的執行緒,所以我不完全知道如何使用呼叫方法。我基本上想將 selected_item 分配為用戶在 UI 執行緒的組合框中選擇的專案。
Dim selected_item As String
If ComboBox1.InvokeRequired Then
selected_item = ComboBox1.Invoke(ComboBox1.SelectedItem)
Else
selected_item = ComboBox1.SelectedItem
End If
我得到錯誤跨執行緒操作無效。我怎樣才能解決這個問題?
uj5u.com熱心網友回復:
當您呼叫時,Invoke您需要指定在 UI 執行緒上呼叫的方法。如果您想獲取一個值,該方法必須回傳該值,然后Invoke將在您的輔助執行緒上回傳相同的值。在你的情況下:
Private Function GetComboBox1SelectedItem() As Object
If ComboBox1.InvokeRequired Then
Return ComboBox1.Invoke(New Func(Of Object)(AddressOf GetComboBox1SelectedItem))
Else
Return ComboBox1.SelectedItem
End If
End Function
然后,您可以在任何執行緒上呼叫該GetComboBox1SelectedItem方法,它將回傳當前選定的專案。
如果您在輔助執行緒上呼叫該方法,InvokeRequired則True執行將進入If塊。在該塊中,該Invoke方法創建一個委托,將其編組到 UI 執行緒并呼叫它。該委托用于相同的方法,因此它會第二次執行。第二次,我們在 UI 執行緒InvokeRequired上False,執行進入Else塊。在該塊中,Selecteditem檢索并回傳 。然后該Invoke方法回傳該方法的第二個實體回傳的值,該值由第一個實體回傳。
您可能想閱讀這篇文章,以更嚴格地解釋如何構建這些方法以及它們實際上做了什么。
uj5u.com熱心網友回復:
短一點
Dim selected_item As String
If ComboBox1.InvokeRequired Then
selected_item = ComboBox1.Invoke(Sub() ComboBox1.SelectedItem)
Else
selected_item = ComboBox1.SelectedItem
End If
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/496196.html
