执行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
请指导。
答案 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