2012-11-05 154 views
0

我不知道如何接近冠軍這個問題,所以我會介紹我的情況,希望我是清楚我的疑惑。 (如果有一個爲標題更好的建議,我會改變它)控制爲參數的委託方法

在過去的幾天裏,我閱讀關於圍繞多線程和GUI使用場景控制修改。 我的問題涉及將控件作爲我的委託和方法的參數進行更改。 比方說,我有一個ListView1的,我想一個組添加到它(這是一個簡單的經驗,並擁有幾個代碼)

據我看到的例子,做它的方式是

Private Delegate Sub ResultsAddGroup_Delegate(ByVal FondsGroup As ListViewGroup) 

Private Sub ResultsAddGroup(ByVal FondsGroup As ListViewGroup) 
    If Me.ListView1.InvokeRequired Then 
     Dim d As New ResultsAddGroup_Delegate(AddressOf ResultsAddGroup) 
     Dim ParamArgs() As Object = New Object() {FondsGroup} 
     Me.ListView1.BeginInvoke(d, ParamArgs) 
    Else 
     Me.ListView1.Groups.Add(FondsGroup) 
    End If 
End Sub 

我通常喜歡通過控制作爲一個參數,以保持代碼清晰和方法或函數從所述特定控制物體。 如果我想通過ListView控件作爲參數針對上述案例,像這樣:

Private Delegate Sub ResultsAddGroup_Delegate(ByVal LView As ListView, ByVal FondsGroup As ListViewGroup) 

Private Sub ResultsAddGroup(ByVal LView As ListView, ByVal FondsGroup As ListViewGroup) 
    If LView.InvokeRequired Then 
     Dim d As New ResultsAddGroup_Delegate(AddressOf ResultsAddGroup) 
     Dim ParamArgs() As Object = New Object() {LView, FondsGroup} 
     LView.BeginInvoke(d, ParamArgs) 
    Else 
     LView.Groups.Add(FondsGroup) 
    End If 
End Sub 

會代表什麼樣的問題多線程和控制不斷變化的目的是什麼? 如果是這樣,有沒有另一種方法來做到這一點,而不指定控制?

另一方面,是否有任何問題,我通常做我的方法(如上所述,通過傳遞控制參數)?

謝謝

回答

0

我已經在幾個項目中使用了第二種模式。它看起來像Ctrl.InvokeRequired是線程安全的那樣工作。使用控件作爲參數很好,因爲它只是一個對象引用。

我想在第一個代碼塊,還有的對象數組初始化的誤差小,這樣的目的是:

Dim ParamArgs() As Object = New Object() {FondsGroup} 

但我毫不猶豫的改變它的情況下,我失去了一些東西:)

+0

是的,我相信是這樣,但是因爲我不確定,所以我希望得到比我更多經驗的人的意見。 關於代碼,這是一個複製/粘貼錯誤,您可以從第二塊代碼中看到。 感謝您的輸入。 – Deltint