获取交叉线程错误甚至使用调用

时间:2015-06-25 08:55:21

标签: vb.net multithreading winforms invoke ui-thread

执行tcViewer.TabPages.Add(t)语句时出现跨线程错误。

代码如下。

Private Function fff(t As TabPage)
    tcViewer.TabPages.Add(t)   'giving cross thread error
End Function

Function WebBrowserThread()
    Dim t As TabPage = New TabPage((k + 1).ToString())
    t.Name = k.ToString()
    tcViewer.Invoke(fff(t))
End Function

请指导。

2 个答案:

答案 0 :(得分:1)

我认为您应该将新TabPage的创建移动到UI线程上:

Private Function fff(k as Integer)
    Dim t As TabPage = New TabPage((k + 1).ToString())
    t.Name = k.ToString()
    tcViewer.TabPages.Add(t)
End Function

Function WebBrowserThread()
    tcViewer.Invoke(fff(k))
End Function

构建TabPage时,最终会到达此调用堆栈:

System.Windows.Forms.dll!System.Windows.Forms.Control.CreateHandle()
System.Windows.Forms.dll!System.Windows.Forms.Application.MarshalingControl.MarshalingControl()
System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.MarshalingControl.get()
System.Windows.Forms.dll!System.Windows.Forms.WindowsFormsSynchronizationContext.WindowsFormsSynchronizationContext()
System.Windows.Forms.dll!System.Windows.Forms.WindowsFormsSynchronizationContext.InstallIfNeeded()
System.Windows.Forms.dll!System.Windows.Forms.Control.Control(bool autoInstallSyncContext)
System.Windows.Forms.dll!System.Windows.Forms.ScrollableControl.ScrollableControl()
System.Windows.Forms.dll!System.Windows.Forms.Panel.Panel()
System.Windows.Forms.dll!System.Windows.Forms.TabPage.TabPage()
System.Windows.Forms.dll!System.Windows.Forms.TabPage.TabPage(string text) 

此时,正在创建Handle,如果您在错误的线程上执行此操作,则其他所有内容都将开始出错(因为创建控件的线程不是&n #39;要运行消息泵)

答案 1 :(得分:-2)

我不知道你得到了什么调用错误但我建议通过在构造函数或加载事件中添加它来禁用跨线程检查(在处理API时非常有用)

$('a' +'#'+idVal+'[rowid="1"]').text();

选中此http://tech.xster.net/tips/invoke-ui-changes-across-threads-on-vb-net/

在wpf中这样的问题很容易修复,因为你有一个线程用于所有控件(Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False

更新

处理UI控件必须在UI线程上

Dispatcher.Invoke