我不确定如何处理这个问题的标题,所以我将描述我的情况,希望我清楚我的怀疑。 (如果对标题有更好的建议,我会改变它)
在过去的几天里,我一直在阅读使用该场景的多线程和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 :(得分:0)
我自己在一些项目中使用过第二种模式。它似乎完成了工作,因为Ctrl.InvokeRequired是线程安全的。使用控件作为参数很好,因为它只是一个对象引用。
我认为在第一个代码块中,对象数组初始化中存在一个小错误,这是有意的:
Dim ParamArgs() As Object = New Object() {FondsGroup}
但是如果我遗漏了某些东西,我会犹豫不决:)