Control.Invoke никогда не вызывает делегат - PullRequest
0 голосов
/ 02 октября 2009

Я работаю с элементом управления 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 ]

1 голос
/ 02 октября 2009

Хм ... "А" что?

Изменить это:

If myItemGrid.InvokeRequired And Then

до:

If myItemGrid.InvokeRequired Then
0 голосов
/ 09 сентября 2011

Вы пытались использовать анонимного делегата? Посмотрите на эту статью , она прекрасно сработала для меня.

...