Frage zu CheckForIllegalCrossThreadCalls vs Invoke/Delegate

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Frage zu CheckForIllegalCrossThreadCalls vs Invoke/Delegate

    Moin :)

    In meinem Projekt mit Threading war ich, wie so viele, auf das Problem gestoßen, das ein Zugriff auf die GUI zu einem Ungültiger threadübergreifender Vorgang führt.

    Zu dem Problem ist von MS folgendes zu finden.

    VB.NET-Quellcode

    1. Public Class InvokeThreadSafeForm : Inherits Form
    2. Public Shared Sub Main()
    3. Application.SetCompatibleTextRenderingDefault(False)
    4. Application.EnableVisualStyles()
    5. Dim frm As New InvokeThreadSafeForm()
    6. Application.Run(frm)
    7. End Sub


    Da hatte ich nicht verstanden wo im Projekt der Code untergebracht werden soll. In einem Nebensatz vom MS Link wird ein CheckForIllegalCrossThreadCalls = False erwähnt. Damit war ich dann ohne die Fehlermeldung Ungültiger threadübergreifender Vorgang zum Ziel gekommen. Worin liegt der Unterschied zwischen CheckForIllegalCrossThreadCalls und dem Invoke/Delegate? Hat das Invoke/Delegate Vorteile und wenn ja, welche?
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:
    @oobdoo Ein Ungültiger threadübergreifender Vorgang findet i.A. statt, wenn von einem Nebenthread aus auf ein GUI-Control zugegriffen wird.
    Diese Zugriffe kannst Du per Invoke in den GUI-Thread delegieren.
    Sieh Dir an, was in Deinen Threads passiert und überlege, ob Du jeden einzelnen Zugriff oder eine (größere) Gruppe von Zugriffen in den GUI-Thread delegierst, da jedes Invoke einen Laufzeit-Overhead mit sich bringt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Moin,

    also das mit dem Beipsiel ist einfach, die Klasse in dein Projekt rein und dieses Form also StartFormular einstellen. Stellst du CheckForIllegalCrossThreadCalls auf false, kann das fehler verursachen weil dann unkoordinierte UI Zugriffe erlaubt sind und dann kann es passieren das was Threadübergreifendes nicht funktioniert(also z.B. das ein Wert nicht der ControlProperty zugewiesen wird), beim invoken ist das koordiniert. Im Anhang ist ein Projekt wo du sehen kannst, wie das mit dem MS Beispiel funktioniert. In der Application.Designer.vb ist dieses Form als das zu nutzende Form eingestellt.
    Dateien
    • FormWithBGW.zip

      (5,01 kB, 32 mal heruntergeladen, zuletzt: )
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DTF“ ()

    Weil er unvollständig ist. Die Arbeit mit einem Delegaten und dem Aufruf von InvokeRequired aus dem MS-Beispiel fehlt komplett.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.