1

我在 vb.net 中有下面的代码,我正在将其转换为 c#。 编辑 编辑了不相关的代码。

但我被困在InvokeRequired. 我添加了一个引用System.Windows.Forms,但代码完成仍然没有显示InvokeRequired。列表视图位于与我调用它的线程不同的线程上,我需要使用 Invoke 来解决这个问题。你能告诉我我错过了什么吗?谢谢你。

    Delegate Sub _AddClient(ByVal client As Socket)
    Private Sub AddClient(ByVal client As Socket)
        If InvokeRequired Then
            Invoke(New _AddClient(AddressOf AddClient), client)
            Exit Sub
        End If
        Dim lvi As New ListViewItem(client.LocalEndPoint.ToString)
        lvi.Tag = client
        lsvClients.Items.Add(lvi)
    End Sub
4

3 回答 3

2

System.Windows.Forms伙计,如果您正在使用WPF System.Windows.Forms.Control,请删除所有对System.Windows.Control.

InvokeRequired()WPF 中不存在,由Dispatcher.CheckAccess().

于 2013-03-22T23:03:25.447 回答
1

试试这个:

Delegate Sub _AddClient(ByVal client As Socket)
Private Sub AddClient(ByVal client As Socket)
    If ListView1.InvokeRequired Then
        Invoke(New _AddClient(AddressOf AddClient), client)
        Exit Sub
    End If
    Dim lvi As New ListViewItem(client.LocalEndPoint.ToString)
    lvi.Tag = client
    ListView1.Items.Add(lvi)
End Sub
于 2013-03-22T22:25:20.503 回答
0

这是如何使用它的示例:

protected void InvokePathDone(Task<IPath<ICoordsCanon>> task,
                              Action<Task<IPath<ICoordsCanon>>> action) {
  if (InvokeRequired)  Invoke(action, task);
  else                 action(task);
}

以下 OP 问题的更新:

InvokeRequired()为 Control 类定义以启用来自事件委托的回调,以确定它们是否在 UI 线程上,从而确定它们是否必须在 Invoke() 下执行它们的操作。

于 2013-03-22T22:15:47.637 回答