在委托方法中作为参数控制

时间:2012-11-05 18:06:13

标签: .net vb.net multithreading user-interface controls

我不确定如何处理这个问题的标题,所以我将描述我的情况,希望我清楚我的怀疑。 (如果对标题有更好的建议,我会改变它)

在过去的几天里,我一直在阅读使用该场景的多线程和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

这会代表多线程和控制更改目的的任何问题吗? 如果是这样,是否有其他方法可以在不指定控件的情况下执行此操作?

另一方面,我通常使用我的方法有什么问题(如上所述,将控件作为参数传递)?

谢谢

1 个答案:

答案 0 :(得分:0)

我自己在一些项目中使用过第二种模式。它似乎完成了工作,因为Ctrl.InvokeRequired是线程安全的。使用控件作为参数很好,因为它只是一个对象引用。

我认为在第一个代码块中,对象数组初始化中存在一个小错误,这是有意的:

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

但是如果我遗漏了某些东西,我会犹豫不决:)