Похоже, вы пытаетесь передать адрес метода с аргументами в конструктор Action
(версия без аргументов универсального типа).
Вместо этого вы должны указать тип (ы) аргумента (ов) в UpdateDgv
, используя правильный конструктор
New Action(Of T, ...)()
Вот три возможных варианта UpdateDgv
и соответствующие им Invoke
вызовы.
Private Sub UpdateDgv0()
End Sub
Private Sub UpdateDgv1(arg1 As Object)
End Sub
Private Sub UpdateDgv2(arg1 As Object, arg2 As EventArgs)
End Sub
Private Sub UpdateDgvThread()
DataGridView1.Invoke(New Action(AddressOf UpdateDgv0))
DataGridView1.Invoke(New Action(Of Object)(AddressOf UpdateDgv1), New Object())
DataGridView1.Invoke(New Action(Of Object, EventArgs)(AddressOf UpdateDgv2), New Object(), New EventArgs())
End Sub
Другой вариант - просто использовать анонимный метод, чтобы обернуть вызов к UpdateDgv
, и вы вообще не увидите конструктор Action
. Это работает, потому что Sub()
удовлетворяет Delegate
, точно так же как Action
, но только указатель функции AddressOf
не делает.
DataGridView1.Invoke(Sub() UpdateDgv0())
DataGridView1.Invoke(Sub() UpdateDgv1(New Object()))
DataGridView1.Invoke(Sub() UpdateDgv2(New Object(), New EventArgs()))
Поскольку вы используете .NET 3.0, вы не увидите без параметров Action
, который был представлен в 3.5. Вы можете сделать свой собственный делегат Action довольно просто. Добавление этого к вашему исходному коду также решило бы проблему
Private Delegate Sub Action()
Он превосходит подход DataGridView1.Invoke(Sub() UpdateDgv())
, поскольку включает в себя на один вызов меньше трассировки стека (хотя компилятор может оптимизировать его, я не уверен).