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

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

另一方面,我通常执行我的方法的方式是否有任何问题(如上所述,将控件作为参数传递)?

谢谢

4

1 回答 1

0

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

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

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

但是我会犹豫是否要更改它,以防我遗漏一些东西:)

于 2012-11-05T21:52:10.190 回答