Zugriff von Nebenprozess auf UI - Möglichkeiten

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

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

    Zugriff von Nebenprozess auf UI - Möglichkeiten

    Hallo liebe Community,

    ich hab mich ans Thema Multi-Threading gewagt und wollte nun erfragen, was hier gängig bzw. am Sinnvollsten ist.

    Der Haupt-Thread beherbergt das UI.
    In einem weiteren Thread wird was berechnet und dann möchte ich das Ergebnis auf der Oberfläche in einem Label anzeigen.

    Da der Nebenthread nicht das UI erstellt hat, würde eine Exception "Ungültiger threadübergreifender Vorgang" kommen.
    Um das zu umgehen, arbeitet man mit BeginInvoke/Invoke.

    Hier ein Beispiel, wie ich es bislang gemacht habe:

    C#-Quellcode

    1. internal void UpdateUI(string value)
    2. {
    3. MethodInvoker threadSafeCall = delegate { lblStatus.Text = value; };
    4. if (InvokeRequired)
    5. BeginInvoke(threadSafeCall);
    6. else
    7. threadSafeCall();
    8. }


    Dieser Code-Block sitzt im UI-Thread (frmMain), wird dann über den Nebenthread aufgerufen und kann somit ohne Exception das UI aktualisieren.

    Meine Frage ist nun, ob es auch noch andere Möglichkeiten gibt, dies zu tun, bspw. über Eigenschaften (ohne Invoke) ?

    Danke für Eure Infos ^^
    @TRiViUM Das geht so, allerdings verwendet man keine Delegaten mehr.
    Ich mache das meist so:

    C#-Quellcode

    1. internal void UpdateUI(string value)
    2. {
    3. if (InvokeRequired)
    4. {
    5. // ruft sich selbst auf
    6. this.Invoke(new Action<string>(UpdateUI), value);
    7. return;
    8. }
    9. lblStatus.Text = value;
    10. }
    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!
    @RodFromGermany Danke für die Info, werde ich mir mal so aneignen.
    Die Methodik verstehe ich; Beim Selbst-Aufruf mit Invoke ist InvokeRequired dann false und er überspringt das if.
    Das mit dem BeginInvoke kann man aber trotzdem noch bei der Action nutzen, oder?

    Ist so eine Prozedur auch notwendig, wenn ich das UI über Eigenschaften aktualisieren möchte?
    Also im Setter der Property dann das Label aktualisieren...

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

    TRiViUM schrieb:

    Das mit dem BeginInvoke kann man aber trotzdem noch bei der Action nutzen, oder?
    Klar.
    Dann wird es im nächsten Idle-Zyklus der GUI durchgeführt.
    So eine Prozedur ist dann notwendig, wenn Zugriffe aus mehreren Threads erwartet werden.
    Wenn Du mehrere Eigenschaften ändern möchtest, mache das mit einem gemeinsamen Invoke, denn das ist etwas Performance-lastig.
    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!