Thread-Synchronisation - Invoke oder Event eleganter ?!

  • C#
  • .NET (FX) 1.0–2.0

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

    Thread-Synchronisation - Invoke oder Event eleganter ?!

    Hallo liebe Community,

    ich habe eine Frage bezüglich der Thread-Synchronisierung.
    Es gibt neben dem Ui-Thread noch ein paar andere Threads, welche z.B. Labels auf dem Ui aktualisieren sollen.

    Ich bin mir nur nciht ganz sicher, was dort die elegantere bzw. sauberere Lösung wäre.
    Momentan mach ich es so, dass wenn ein Thread die Arbeit erledigt hat, dieser per Invoke das Ui aktualisiert:

    C#-Quellcode

    1. MethodInvoker task = delegate
    2. {
    3. lblStatus.Text = text;
    4. };
    5. if (InvokeRequired) Invoke( task );
    6. else task();


    Dann bin ich auf die Idee gekommen, die Threads ein Event feuern zu lassen, welche vom Ui abonniert wurden.
    Dort müsste ich dann nicht mehr mit Invoke arbeiten, oder etwa doch?
    Dadurch würde ich mir evtl. etwas Zeit-Einsparung erhoffen, da dies für meine Anwendung kritisch ist.

    Danke für die Infos
    ~ TRiViUM

    ErfinderDesRades schrieb:

    delegiert noch nichts in einen anderen Thread

    Wie genau meinst du das?

    Also meine Überlegung war,
    anstatt: Thread -> mit Invoke das Label im Ui aktualisieren
    das: Thread -> Feuert Event -> Ui hat dieses Event abonniert -> aktualisiert bei gefeuertem Event ein Label

    Progress<T> hatte ich auch schon mal in einem recht alten Projekt verwendet und schon gar nicht mehr auf dem Schirm gehabt.
    Soweit ich mich erinnere, löst das auch Events aus...
    Danke für den Hinweis.

    Also ist die Sache mit Invoke eher die unelegantere?
    @TRiViUM Muss das, was getan werden soll, in einem anderen Thread erledigt werden?
    Ja: Invoke,
    Nein: Event.
    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!
    Das Event bringt Dir nix. Wenn der EventHandler das nebenläufige Event empfängt, ist es im selben Thread wie der Aufrüber - im Nebenthread. Die Folge: unerlaubter threadübergreifender Prozess.
    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.
    Hat zwar nix mit diesem Thema zu tun, aber ja, das Event wird nebenläufig, also in dem Fall aus einem anderen Thread gefeuert - und somit auch im selbigen empfangen. Daher sind im SerialPort.DataReceived-EventHandler, keine direkten GUI-Änderungen erlaubt - außer man arbeitet dann eben mit Invoking (also BeginInvoke oder notfalls - wenn gute Begründung besteht - mit Invoke).

    MSDN schrieb:

    The DataReceived event is raised on a secondary thread when data is received from the SerialPort object. Because this event is raised on a secondary thread, and not the main thread, attempting to modify some elements in the main thread, such as UI elements, could raise a threading exception. If it is necessary to modify elements in the main Form or Control, post change requests back using Invoke, which will do the work on the proper thread.

    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.