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
Вы пытались использовать анонимного делегата? Посмотрите на эту статью, она отлично работает для меня.