Laden...

Form bzw. Tabcontrol lädt langsam

Erstellt von vivilakaphil vor 9 Jahren Letzter Beitrag vor 9 Jahren 3.237 Views
V
vivilakaphil Themenstarter:in
16 Beiträge seit 2012
vor 9 Jahren
Form bzw. Tabcontrol lädt langsam

Hallo Community,

ich komme leider nicht mehr weiter.
Ich habe eine Liste, in der ich auf Details klicken kann. Wenn ich auf Details klicke, öffnet sich eine neue Form mit einem TabControl.
Das Problem hierbei ist, dass das TabControl ca. 2 Sekunden braucht um zu laden.
Dazu kommt, dass das Laden flackert, bedeutet, es wird erst etwas angezeigt, bleibt dann kurz hängen und wird dann richtig geladen, bzw. dargestellt.

Ich glaube, dass das Problem darin liegt, dass ich in dem Load-Ereignis zur Laufzeit TabPages Remove oder aber von Button und Labels zum Beispiel die Visibility ändern. Oder aber ReadOnly setze.

Was ich sagen kann, ist dass es nicht an den SQL-Abfragen liegt, da diese maximal 0,5 Sekunden benötigen.

Außerdem rufe ich folgende Methode im Load-Ereignis am Anfang und am Ende auf:
Am Anfang:

this.SuspendLayout();

Am Ende:

this.ResumeLayout();

Über jegliche Antworten bin ich dankbar.

vivilakaphil

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo vivilakaphil,

wie viele Controls hast du in der Summe im Form bzw. im Tabcontrol?

Wieviele Aktionen (z.B. Visibility ändern) führst du aus?

Schau mal mit einem Profiler, wo genau die Zeit verbraten wird.

herbivore

V
vivilakaphil Themenstarter:in
16 Beiträge seit 2012
vor 9 Jahren

Danke für deine Antwort herbivore.

Insgesamt habe ich 9 TabPages.
Controls TabPage 1: 35 Controls
Controls TabPage 2: 1 Control -> Darunter 1 DatagridView
Controls TabPage 3: 8 Controls
Controls TabPage 4: 3 Controls -> Darunter 1 DatagridView
Controls TabPage 5: 13 Controls -> Darunter 1 DatagridView
Controls TabPage 6: 17 Controls -> Darunter 1 DatagridView
Controls TabPage 7: 19 Controls -> Darunter 1 DatagridView
Controls TabPage 8: 9 Controls
Controls TabPage 9: 9 Controls -> Darunter 2 DatagridViews

Ich führe ca. 37 Aktionen aus, die die Visibility oder ähnliches entsprechen.

Ich habe mir mal den dotTrace Performance von jetBrains heruntergeladen und folgendes ist dabei rausgekommen:

User code hotspots
6.357 ms MyNetworkStream.Read
5.134 ms Program.Main
1.578 ms ArtikelDetails.LoadBild
1.328 ms Funktionen.DLookupTable
1.043 ms MySqlDateTime.ParseMySql
716 ms MySqlPacket.ReadString
569 ms BaseForm..ctor
553 ms main.StartLogin
508 ms main.InitalizeComponent

_____

Main Thread:
69,79% WinForms
22,32 % System code
4,08 % User code

_____

Other threads, agregated
99,36 % Wait

Nun verstehe ich leider nicht so ganz, was mit das alles sagt. Bzw. wo ich ansetzen muss, um die Schnelligkeit zu verbessern.

vivilakaphil

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo vivilakaphil,

120 Controls in einem Form sind schon eine ganze Menge. Es wäre besser, wenn du mit weniger auskommen könntest. Eine Möglichkeit ist, die Controls einer Tabpage jeweils in ein UserControl auszulagern und immer nur das UserControl zu erzeugen, das in der sichtbaren TabPage angezeigt werden soll und wieder zu zerstören, wenn eine andere TabPage sichtbar wird. Siehe auch [FAQ] Assistenten/Wizards: Mit Windows Forms eine Art Frameset einer Website nachbauen.

Wenn du die Stelle, die die Zeit verbrät, mit dem Profiler nicht eingrenzen kannst, kannst du immer noch deinen Code mit einer Stopwatch instrumentieren, z.B. zuerst den ganzen EventHandler messen und wenn er zulange dauert, den kritischen Bereich (z.B. in einer Art binären Suche) langsam eingrenzen.

Solange wir nicht wissen, was genau die Zeit kostest, können wir kaum sinnvoll Ratschläge zur Behebung geben. Du kannst dir aber schon mal Controls in anderem Thread erzeugen als das Form [==> auf keinen Fall / Liste der Alternativen] und [FAQ] Flackernde Controls vermeiden / Schnelles, flackerfreies Zeichnen anschauen.

herbivore

F
10.010 Beiträge seit 2004
vor 9 Jahren

Meist verbraucht das DGV eine grosse Zeit damit automatische Breiten/Höhen zu berechnen.

V
vivilakaphil Themenstarter:in
16 Beiträge seit 2012
vor 9 Jahren

Vielen dank für die Antwort.

Ich habe herausgefunden, dass es auch an den SQL-Abfragen lag.
Bedeutet, ich habe den Abfragen indexes hinzugefügt, dadurch hat sich die ganze Performance verbessert.

Ja, das einzige Problem ist, dass die Form einmal für 0,5 Sekunden ca. hängen bleibt.
Das ist jetzt erstmal nicht weiter tragisch, aber in Zukunft möchte ich natürlich dahin kommen, dass es sich nicht für 0,5 Sekunden aufhängt.

Leider kann ich dort keine Controls herausnehmen. Der Aufbau muss so bleiben wie er ist.

Aber trotzdem danke für die Links und deine mühe, werde mir die Links bei gelegenheit mal anschauen.

Meist verbraucht das DGV eine grosse Zeit damit automatische Breiten/Höhen zu berechnen.

Das kann ich ausschließen, da ich z.B. kein AutoSizeColumnsMode angegeben habe.

Aber trotzdem danke!

vivilakaphil

Hinweis von Coffeebean vor 9 Jahren

Full Quote entfernt. Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 2.3

T
708 Beiträge seit 2008
vor 9 Jahren

Hallo vivilakaphil,

Ja, das einzige Problem ist, dass die Form einmal für 0,5 Sekunden ca. hängen bleibt.
Das ist jetzt erstmal nicht weiter tragisch, aber in Zukunft möchte ich natürlich dahin kommen, dass es sich nicht für 0,5 Sekunden aufhängt.

Leider kann ich dort keine Controls herausnehmen. Der Aufbau muss so bleiben wie er ist.

Es kommt nun natürlich darauf an, was diese 0,5 Sekunden kostet.
Wenn es am SQL-Statement liegt, musst Du die Abfrage vom Laden der Form trennen (Auslagerung in einen anderen Thread).

Liegt es an der Vielzahl der Controls, so bietet sich herbivores Vorschlang an. Darin geht es nicht darum, dass Du mit weniger Controls auskommen sollst, sondern darum, dass diese Controls erst geladen werden, wenn auch der entsprechende Tab angezeigt wird.

Gruß,
trib

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo vivilakaphil,

Auslagerung in einen anderen Thread

siehe dazu [FAQ] Warum blockiert mein GUI? und [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke), dort ist alles ausführlich und vollumfassend beschrieben (und beachte deshalb bitte, dass das Auslagern unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1 und 1.1 fällt.

herbivore