2015-06-25 61 views
0

执行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

我不知道你会得到什么调用错误,但我建议禁用跨线程通过(使用API​​打交道时非常有用)在构造或加载事件增加这个检查

Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False 

入住这http://tech.xster.net/tips/invoke-ui-changes-across-threads-on-vb-net/

在WPF这样的问题

很容易解决,因为你有一个线程的所有控件(Dispatcher.Invoke

更新

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

Me.Invoke(sub() 
      Dim t As TabPage = New TabPage((k + 1).ToString()) 
      t.Name = k.ToString() 
      fff(t) 
      End Sub) 




    Me.Invoke(sub() 
       tcViewer.TabPages.Add(t) 
      End Sub) 
+0

在WIN窗体中,设置交叉线程检查错误,但得到相同的错误,如下所示:'在一个线程上创建的控件不能用于不同线程上的控件。'你知道如何使用tab控件的Invoke来添加标签页吗? – dsi

+0

尝试此> Me.Invoke(子() 昏暗T作为TabPage的=新的TabPage((K + 1)的ToString()) t.Name = k.ToString() FFF(吨) 完子) – bigworld12

+0

@ bigworld12如果你打算建议使用CheckForIllegalCrossThreadCalls = False,那么你应该指出,它可能会导致明显的随机崩溃,这将很难调试。 –

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,一d如果你是在错误的线程上执行该操作,则其他一切都将开始出错(因为创建控件的线程不会运行消息泵)