2012-11-05 105 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