Zur Zeit arbeite ich mit WinForms (in C #) und ich muss die Anwendung im Hintergrund ausführen. Zu diesem Zweck verwende ich asynchron. Wenn ich die Anwendung starte, wird eine Ausnahme wie
angezeigt"Kreuzthread-Operation nicht gültig: Steuerung '', auf die von einem anderen Thread als dem Thread, auf dem sie erstellt wurde, zugegriffen wird."
Wie kann ich diesen Fehler beheben?
Wenn Sie bei Methodenaufrufen an ein Steuerelement einen anderen Thread aufrufen als den, an dem das Steuerelement erstellt wurde, müssen Sie einen Aufruf mit Steuerung.Invozieren . Hier ist ein Codebeispiel:
%Vor%Ich hoffe, es hilft.
Meistens ist der beste Weg, um mit WinForms so etwas zu machen, BackgroundWorker , die Ihre Arbeit an einem Hintergrundthread ausführen, Ihnen aber eine saubere Möglichkeit bieten, den Status an die Benutzeroberfläche zurückzumelden.
In vielen alltäglichen .NET-Programmen ist das explizite Erstellen von Threads oder das Aufrufen von .Invoke ein Zeichen dafür, dass Sie das Framework nicht zu seinem vollen Vorteil nutzen (natürlich gibt es viele legitime Gründe, Low-Level-Kram zu machen) Es ist auch nur so, dass sie weniger häufig sind, als Menschen manchmal erkennen.)
Ein Muster, das Sie möglicherweise nützlich finden, ist eine Überprüfung an der Spitze der Funktionen, die mit der GUI interagieren, um zu sehen, ob Sie auf dem richtigen Thread laufen oder nicht und die Funktion selbst aufrufen, falls erforderlich. So:
%Vor%Verwendung dieses Musters - Wenn Sie beim Aufruf der Methode im richtigen Thread sind, ruft es sich nicht selbst auf, aber wenn Sie sich in einem anderen Thread befinden, ruft es sich selbst auf und kehrt dann zurück (die GUI-Manipulationslogik ist also immer) einmal aufgerufen wie auch immer).
Tags und Links c# multithreading winforms