AD Abfrage im Form_Shown Event

  • C#
  • .NET (FX) 4.5–4.8

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

    AD Abfrage im Form_Shown Event

    Hi,
    ich hab eine kleine Telefonbuchapp auf Basis des AD geschrieben.
    Nun rufe ich alle Userdaten im Form_Shown Event ab und schreibe sie in ein Datatable.
    Eigentlich dachte ich, das das Form_Shown erst gefeurt wird, wenn die Form vollständig gezeichnet wurde.
    Nun ist es aber so, das die Form noch am zeichnen ist und das Abrufen der Daten schon beginnt.
    Hab versucht das mit

    C#-Quellcode

    1. ​ Parallel.Invoke(GetData);
    abzufangen. Sieht trotzdem noch doof aus :(
    Gibts irgendeinen Workaround das die Form Vollständig da ist und dann erst die Daten abgerufen werden?
    Einen zusätzlichen Button möcht ich nicht gerne da drauf haben...
    Hier noch 2 Screenshots. Beim Starten: und nachdem alles geladen und abgerufen ist:
    Danke Euch
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    und dann erst die Daten abgerufen werden
    Starte im Shown-Event einen Timer, in dessen Tick-Routine Du den Timer löschst und Deine Daten ausliest.
    Ansonsten lies Deine Daten in einem Thread aus.
    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!

    MichaHo schrieb:

    ich dachte das wäre nicht so elegant
    Was sollte daran nicht elegant sein?
    Es gibt z.B. den Threading.Timer, der es per Konstruktor gestattet, nur einen einzigen Ping auszulösen.
    Das finale Problem ist, wie lange Deine Initialisierung dauert.
    Mit zunehmender Komplexität dauert das erfahrungsweise immer länger, somit ist die Thread-Lösung in jedem Fall die bessere. :thumbup:
    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!
    Kann man das nicht über einen Task lösen, der am Ende des Shown Events ausgeführt wird? Dürfte doch das Problem lösen, oder nicht?

    P.S. Zugriffe auf die GUI aus einem Thread mit Invoke kosten immer zeit, was zum freeze der GUI führen kann.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hi,
    Sorry, ich war gestern aushäusisch :)
    So, ich hab ein wenig rum probiert. Im Grunde klappen alle Hinweise Thread, Timer und Task.
    Hab mich jetzt für den Task entschieden.
    Weis nicht ob so richtig erstellt ist.
    Erstmal hab ich in der Form Klasse nen Task definiert

    C#-Quellcode

    1. ​Task t;
    dann hab ich im Form_Load den einen neuen Task erstellt und die Methode übergeben:

    C#-Quellcode

    1. ​t = new Task(GetData);

    Und im Form_Shown den Task gestartet

    C#-Quellcode

    1. ​t.Start();

    Klappt bestens, die Form ist direkt da und mit minimaler Verzögerung erscheinen auch die Einträge wenn ich anfange ins Suchfeld zu tippen.
    Das sieht gut aus so....
    Danke Euch.
    Sollte man das mit dem Task so machen oder kann das alles ins Form_Shown? den Task brauch ich ja eigentlich nur ein einziges Mal beim Starten.
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    kann das alles ins Form_Shown?
    Wo isses denn jetzt?
    Klar, das kann alles in eine Prozedur. Form_Shown ist da besser als Form_Load wegen den verschluckten Exceptions.
    ====
    Sieh Dir mal Task.Run() an, gugst Du hier.
    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 naja, wie oben beschrieben. erst ne Variable Task t erstellt, dann instanziert im Form Load, dann im Form_Shown gestartet.
    Habs gerade mal geändert, sodass alles im Form_Shown gemacht wird. Dann den MSDN Artikel überflogen und es nun so abgeändert:

    C#-Quellcode

    1. ​private void frmMain_Shown(object sender, EventArgs e)
    2. {
    3. Task.Run(()=> { GetData(); });
    4. }

    Klappt genauso geschmeidig. :thumbsup:
    "Hier könnte Ihre Werbung stehen..."