2015-06-25 2 views
0

Ошибка при перекрестном потоке при выполнении инструкции tcViewer.TabPages.Add(t).Получение перекрестной резьбы Ошибка даже при использовании Invoke

Код выглядит следующим образом.

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/

в МОФ таких проблем легко исправить, потому что у вас есть один поток для всех элементов управления (Dispatcher.Invoke)

Update

дело с элементами управления пользовательского интерфейса должны быть в потоке пользовательского интерфейса

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 установите поперечную нить проверяя false, но получая ту же ошибку, что и ниже. Элементы управления, созданные в одном потоке, не могут быть отфильтрованы для элемента управления в другом потоке. «Вы знаете, как использовать« Invoke »элемента управления вкладками для добавления закладки? – dsi

+0

попробовать это> Me.Invoke (Sub() Dim т Как TabPage = Новый TabPage ((к + 1) .ToString()) t.Name = k.ToString() FFF (т) End Sub) – bigworld12

+0

@ bigworld12 Если вы планируете использовать CheckForIllegalCrossThreadCalls = False, вы должны также указать, что это может привести к случайным сбоям, которые будет трудно отлаживать. –

1

Я думаю, вы должны переместить создание нового TabPage на поток пользовательского интерфейса, а также:

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, если вы делаете это на неправильном потоке, все остальное начнет идти не так (потому что поток, на который был создан элемент управления, не будет запускать насос сообщений)

Смежные вопросы