2016-05-03 17 views
-3

ich völlig bin versucht zu illegalen crossthreads mitvollständig zu deaktivieren Thread-Sicherheit in VB.Net

CheckForIllegalCrossThreadCalls = False 

ich für diese Suche endete Überprüfung zu deaktivieren, nachdem ich erkennen, dass ich mehrere Registerkarten in einem TabControl zu haben, nicht in der Lage war, mit mehreren WebBrowser-Steuerelementen und dem Ändern der GUI - das WebBrowser-Steuerelement tatsächlich - auf allen Registerkarten gleichzeitig.

Das Problem ist, dass ich CheckForIllegalCrossThreadCalls vollständig deaktiviert werden muss, aber es scheint, dass ich einen Cross-Thread-Fehler bekomme, auch wenn ich es in meinen Code einfügen. Gibt es etwas Besonderes, wie eine Einstellung oder etwas, das ich optimieren sollte?

+0

zeigen uns Ihren Code bitte. . . – Werdna

+0

@Werdna Ich kann meine Frage aus irgendeinem Grund nicht bearbeiten. Darf ich es in Pastebin posten und mit dem Link hier antworten? – CDoc

+0

Ich kann Ihre Frage ganz einfach bearbeiten. Was passiert, wenn Sie auf Bearbeiten klicken? –

Antwort

1

Deaktivierung CheckForIllegalCrossThreadCalls ist wirklich keine gute Idee. Warum machen Sie Ihren Code nicht threadsicher?

Es ist eigentlich einfacher als viele denken. Was Sie tun müssen, ist eine Methode aufrufen, die die InvokeRequired Eigenschaft des Formulars überprüft. Wenn es True zurückgibt, wird die Funktion sich selbst aufrufen und dann die angegebene Aufgabe ausführen.

Hier ist, wie Sie es tun würde, in .NET 4.0 oder höher:

Public Sub InvokeIfRequired(ByVal Method As Action) 
    If Me.InvokeRequired = True Then '"Me" being the current form. 
     Me.Invoke(Sub() InvokeIfRequired(Method)) 'Invoke this method to make it thread-safe. 
    Else 
     Method.Invoke() 'Execute the specified method. 
    End If 
End Sub 

Und hier ist, wie Sie es in .NET 3.5 tun würde oder niedriger:

Delegate Sub InvocationDelegate(ByVal Method As Action) 

Public Sub InvokeIfRequired(ByVal Method As Action) 
    If Me.InvokeRequired = True Then '"Me" being the current form. 
     Me.Invoke(New InvocationDelegate(AddressOf InvokeIfRequired), Method) 'Invoke this method to make it thread-safe. 
    Else 
     Method.Invoke() 'Execute the specified method. 
    End If 
End Sub 

Beispielverwendung:

.NET 4.0 oder höher:

'Thread-safely sets Label1's text. 
InvokeIfRequired(Sub() Label1.Text = "Hello World!") 

.NET 3.5 oder niedriger:

'Thread-safely sets Label1's text. 
InvokeIfRequired(AddressOf SetNewText) 

...further down in code... 

Private Sub SetNewText() 
    Label1.Text = "Hello World!" 
End Sub 
Verwandte Themen