【问题标题】:How to use InvokeRequired如何使用 InvokeRequired
【发布时间】:2013-03-22 21:55:57
【问题描述】:

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

但我被困在InvokeRequired 的那个。我添加了对System.Windows.Forms 的引用,但代码完成仍然没有显示InvokeRequired。 listview 与我调用它的线程位于一个单独的线程上,我需要使用 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

【问题讨论】:

  • 您也可以发布您的 C# 代码...如果这是 FormControl 的后代,则应该可以使用 InvokeRequired
  • c# 代码几乎相同,只是我似乎无法让If InvokeRequired Then Invoke(New _AddClient(AddressOf AddClient), client) Exit Sub End If 工作
  • 调用InvokeRequired() 的类必须直接或间接派生自类Control 才能调用InvokeRequired()。否则,它将需要对可以调用InvokeRequired() 的控件的引用。你的类是直接还是间接派生自Control
  • hmmm...实际上没有其他类:(也许我是模棱两可的。上面的整个代码是一个异步服务器。没有其他类在调用它,我只是试图从 Control 和仍然 InvokeRequired 不可用:(
  • 更正@MatthewWatson ..我认为你是对的:)它似乎正在工作......即从 Control 派生类后,invokerequired 可用...我现在对其进行测试以查看它是否有效

标签: c# wpf vb.net


【解决方案1】:

伙计,如果您正在使用 WPF,请删除对 System.Windows.Forms 的所有引用,WPF 不需要,也不关心这一点,并且您最好不要与来自不同命名空间和框架的具有相同名称的类混淆(例如System.Windows.Forms.ControlSystem.Windows.Control

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

【讨论】:

  • 感谢 HighCore。您再次成功修复了我的问题编号 230 万。
【解决方案2】:

试试这个:

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

【讨论】:

  • ListView1.InvokeRequired 行仅在我使用 :Control 从 Control 派生时才有效,但编译失败...如果我不从 Control 派生 .InvokeRequired 甚至不可用。 :(
  • 你的 lsvClients 是什么样的控制?什么类型?
  • 它是 WPF 窗口上的列表视图
  • +1 该评论帮助我使用 Dipatcher.CheckAccess() 修复它
【解决方案3】:

这是一个如何使用它的示例:

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() 下执行它们的操作.

【讨论】:

  • 但这正是我的问题。 InvokeRequired 仅在我将:控件放在我的部分类旁边时才可用,但是编译仍然失败,说部分声明不能指定基类...我确定我在这里遗漏了一些非常基本的东西:(
  • 查看我的更新。事件回调必须在 UI 线程中执行它们的工作,但它们可能在另一个线程中运行。 Invoke required 使他们能够确定该状态。
  • 感谢您的回答和时间,但我再次明白为什么需要 InvokeRequired,让我脑筋急转弯的问题是 InvokeRequired 只有在我从“控制”派生我上面的类时才可用",但是当我编译失败时说我不能指定不同的基类:(
  • C#不支持多重实现继承;只支持多接口继承。
猜你喜欢
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多