首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用InvokeRequired

如何使用InvokeRequired
EN

Stack Overflow用户
提问于 2013-03-22 21:55:57
回答 3查看 6.9K关注 0票数 1

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

但我被困在InvokeRequired的那个。我添加了对System.Windows.Forms的引用,但是代码完成仍然没有显示InvokeRequired。listview位于我正在调用它的线程上,我需要使用Invoke绕过这个线程。你能告诉我我错过了什么吗?谢谢。

代码语言:javascript
运行
复制
    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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-22 23:03:25

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

InvokeRequired()不存在于WPF中,而是被Dispatcher.CheckAccess()所取代。

票数 2
EN

Stack Overflow用户

发布于 2013-03-22 22:25:20

试试这个:

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2013-03-22 22:15:47

下面是一个如何使用它的例子:

代码语言:javascript
运行
复制
protected void InvokePathDone(Task<IPath<ICoordsCanon>> task,
                              Action<Task<IPath<ICoordsCanon>>> action) {
  if (InvokeRequired)  Invoke(action, task);
  else                 action(task);
}

关于OP问题的更新如下:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15580494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档