Control.Invoke从不调用委托

时间:2009-10-01 21:46:52

标签: vb.net multithreading invokerequired

我正在使用DevExpress XtraGrid控件。

我有一个例程,它会动态地添加当前表单上的所有控件,并在单独的线程上启动给定控件的例程,将其初始化为将显示给最终用户的值。一些控件显示计算值,并花一些时间返回它们的值,这就是为什么我们在一个单独的线程上执行它。

除了特定情况下的DevExpress XtraGrid控件外,一切都按预期工作。

    Private Delegate Sub SetGridDataSourceDelegate(ByVal Data As List(Of myItem))

    Private Sub SetGridDataSource(ByVal Data As List(Of myItem))
        If Not IsNothing(myItemGrid) Then
            If myItemGrid.InvokeRequired Then
                Dim d As New SetGridDataSourceDelegate(AddressOf SetGridDataSource)
                myItemGrid.Invoke(d, New Object() {Data})
            Else
                myItemGrid.DataSource = Data
            End If
        End If
    End Sub

我正在为任何必须更新的控件属性使用类似的代码片段,并且一切正常。在上面的代码中调用实际的Invoke时,它表示线程刚刚结束并且从不调用委托,并且也没有返回完成。

有人对可能导致这种奇怪行为的行为有任何想法吗?

2 个答案:

答案 0 :(得分:1)

嗯...“和”什么?

改变这个:

If myItemGrid.InvokeRequired And Then

为:

If myItemGrid.InvokeRequired Then

答案 1 :(得分:0)

您是否尝试过使用匿名代表?看看这个article它对我来说很有用。