我在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
发布于 2013-03-22 23:03:25
伙计,如果您正在使用WPF,请删除对System.Windows.Forms
的所有引用,WPF不需要,也不关心这一点,最好不要混淆来自不同名称空间和框架(例如System.Windows.Forms.Control
和System.Windows.Control
)的同名类。
InvokeRequired()
不存在于WPF中,而是被Dispatcher.CheckAccess()
所取代。
发布于 2013-03-22 22:25:20
试试这个:
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-22 22:15:47
下面是一个如何使用它的例子:
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()下执行其操作。
https://stackoverflow.com/questions/15580494
复制相似问题