我不明白这个 datagridview new action invoke 命令的语法应该是什么

I don't understand what the syntax should be for this datagridview new action invoke command

我正在尝试生成一个程序来监视数据库文件的更改并return datagridview 列表中的最后 10 个条目。

我搜索了一大堆 Google 与 Invoke 和 New Action 相关的参考资料,并尝试了各种代码迭代,但由于即使阅读了 Microsoft 文档和论坛参考,我无法使语法正确。

Private Sub UpdateDgvThread()
    RemoveHandler watcher.Changed, AddressOf OnChanged
    DataGridView1.Invoke(New Action(AddressOf UpdateDgv))
    AddHandler watcher.Changed, AddressOf OnChanged
End Sub

当 运行 程序和我最接近的是将错误行更改为

时,我收到“'System.Action(Of T)' 的类型参数太少”错误
DataGridView1.Invoke(New Action(Of ????)(AddressOf UpdateDgv))

这似乎是一个更正的语法(?)但我不知道什么是 ????应该是。

您似乎正试图将带有参数的方法的地址传递给 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,因此您不会看到 3.5 中引入的无参数 Action。您可以非常简单地创建自己的 Action 委托。将此添加到您的原始代码中也可以解决问题

Private Delegate Sub Action()

它优于 DataGridView1.Invoke(Sub() UpdateDgv()) 方法,因为它减少了对堆栈跟踪的一次调用(虽然编译器可能会优化它,但我不确定)。