Control.Invoke никогда не вызывает делегат

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

Хм... а что?

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

If myItemGrid.InvokeRequired And Then

чтобы:

If myItemGrid.InvokeRequired Then

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

Другие вопросы по тегам