Announcement

Collapse
No announcement yet.

C# Äquivalent zu Delphis Synchronize gesucht

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • C# Äquivalent zu Delphis Synchronize gesucht

    Hallo,

    ich muss aus einem Thread heraus per Event in einem GUI die Anzeige von Controls verändern. Dieses Update wird aus einer Methode heraus durchgeführt. Diese Methode muss innerhalb eines Threads ausgeführt werden, aber, weil GUI Element geupdatet werden, möglichst komplett im Kontext des (Main)-GUI Threads. In Delphi gab es für sowas den Befehl synchronize( ThreadMethod ).

    Leider kenne ich dessen Implementierung nicht, sonst würde ich versuchen das alles nachzubauen. Deshalb hier die Frage, ob es sowas schon für C# gibt bzw. was man alles tun muss, um dieses Verhalten zu erreichen.

    Danke,
    Lars

  • #2
    Hallo,

    mit der Thread-Klasse habe ich mich noch nicht beschäftigt; ich bin sicher, auch dabei ist das Aktualisieren von Controls vorgesehen.

    Ich habe bisher immer den BackgroundWorker benutzt, der eine einfachere Benutzung von Threads ermöglicht. Aus den Beispielen in der SDK-Doku dazu geht auch hervor, wie das zu erledigen ist. (Jedenfalls bin ich mit diesen Beispielen gut zum Ziel gekommen.)

    Jürgen

    Comment


    • #3
      Hallo,

      etwa so (quick and dirty):
      Code:
      private void GUI_Member_To_Display_Message(string message)
      {
        if (InvokeRequired)
        {
           Invoke(new MethodInvoker(delegate() 
             { 
                label_Message.Text = message; 
                WriteToLogfile(message);
              }));
        }
        else
        {
           label_Message.Text = message;  // wenn der Aufruf vom GUI-Thread erfolgt
           WriteToLogfile(message);
        }
      }
      Viele Grüße HP

      Comment


      • #4
        Danke schon mal ...

        Hallo HP, hallo Jürgen,

        ich hab das Problem vielleicht nicht so ganz vollständig beschrieben. Sorry. Eine einzelne Aktualisierung eines einzigen Controls funktioniert so wie im Beispiel beschrieben. Ich muss ca. 100000 und mehr Aktualisierungen durchführen (Vergleich von grafischen Anzeigedaten mit sofortiger Aktualisierung aus einem Thread heraus) mit möglichst nur einem Kontextwechsel. Im Moment wird der Kontextwechsel bei jedem Aktualisierungs-Event durchgeführt. Der Thread arbeitet asynchron einen Workflow ab und in einem Schritt müssen die Anzeigeelemente aktualisiert werden. Durch die Kontextwechsel bei jedem Änderungsevent (GUI Control-Updates werden immer im Mainthread durchgeführt) habe ich z.T. mehr als 1 Stunde Verzug. Führe ich die Aktualisierung im Mainthread testhalber aus, benötigt sie 1-2 Sekunden.

        Und genau deshalb dachte ich an den Synchronize-Befehl von Delphi der die Möglichkeit bot, die gesamte Aktualisierung auf einmal im VCL-Thread auszuführen. Was mich interessiert ist, ob sowas auch in einigermaßen simple in C# umzusetzen ist.

        Danke,
        Lars

        Comment

        Working...
        X