Laden...

Bei jedem Change in TextBox mit Databinding Daten gegen Datenbank prüfen gibt Performanceprobleme

Erstellt von _Cashisclay vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.798 Views
_
_Cashisclay Themenstarter:in
277 Beiträge seit 2014
vor 6 Jahren
Bei jedem Change in TextBox mit Databinding Daten gegen Datenbank prüfen gibt Performanceprobleme

Hallo Community,

ich habe das Problem das wenn ich meine TextBox mit meinem VM verbinde und im PropertyChanged Event dann auf jede Eingabe reagiere (Möchte den Wert mit der Datenbank überprüfen) es zu sichtlichen performance Problemem kommt für den Benutzer, hat jemand schon mal Erfahrung gesammelt?

Man könnte es auch anders lösen, allerdings interessiert mich erstmal ob man in dem Fall irgendetwas machen kann?

Grüße

1.029 Beiträge seit 2010
vor 6 Jahren

Hi,

dann sollte man darüber nachdenken, ob man das ganze asynchron laufen lassen kann.

Es stört ja nicht, wenn die Überprüfung eine Sekunde dauert, solange der User ungestört weiterarbeiten kann.

LG

A
764 Beiträge seit 2007
vor 6 Jahren

[...] auf jede Eingabe reagiere [...] Wert mit der Datenbank überprüfen [...]

Hallo _Cashisclay

Du könntest mal messen, wie lange der Zugriff an der Stelle auf die Datenbank braucht und ob der für den Performance-Verlust verantwortlich ist. Wenn du genau weißt, wo das Nadelöhr ist, kannst du das Problem besser handeln.

Gruß
Alf

_
_Cashisclay Themenstarter:in
277 Beiträge seit 2014
vor 6 Jahren

Naja ich gehe weniger davon aus das es an der Datenbank liegt sondern das ja bei jedem Tastenanschlag das PropertyChanged Event ausgelöst wird

2.079 Beiträge seit 2012
vor 6 Jahren

Spricht etwas dagegen, die zu prüfenden Daten einmal in den RAM zu laden und dann nur im RAM zu suchen? Das würde einmal ein wenig Wartezeit bedeuten, danach läuft es im RAM und das Suchen bei jedem Tastendruck kannst Du vernachlässigen.

Option 2:
Du baust ein Delay ein. Erst danach prüfst Du.
So ein Delay lässt sich mit Tasks (Task.Delay) ganz gut lösen. Bei jedem Tastendruck brichst Du das Delay ab und startest es erneut. Erst wenn das Delay einmal vollständig durch gelaufen ist, wird die Anwendung prüfen.
Das hätte dann zur Folge, dass der Nutzer ein paar Zeichen schreibt und erst wenn er kurz inne hält, einmal geprüft wird.

Option 3:
Das Prüfen läuft komplett asynchron und wird nicht gestartet, wenn das Prüfen schon läuft, allerdings ohne Delay.
Der Nutzer schreibt ein Zeichen und stößt damit das Prüfen kann. Nach fünf weiteren Zeichen ist das dann fertig und prüft bei dem sechsten Zeichen erneut.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

709 Beiträge seit 2008
vor 6 Jahren

Du könntest auch per Throttle von Rx.NET das Event nicht bei jedem einzelnen Tastenanschlag sondern nur beim letzten innerhalb der letzten x (Milli-)Sekunden nehmen. Dann kannst du einigermaßen flott tippen und nur nach Pausen, bzw. wenn du fertig bist, wird die Anfrage gesendet.

A
764 Beiträge seit 2007
vor 6 Jahren

Naja ich gehe weniger davon aus das es an der Datenbank liegt sondern das ja bei jedem Tastenanschlag das PropertyChanged Event ausgelöst wird

Das ist ja dann unproblematisch, wenn das ausgelöste Event nicht lange braucht.
Z.B. Überprüfung auf eine bestimmte Taste, wie 'Escape'.

F
26 Beiträge seit 2013
vor 6 Jahren

Wenn die Textbox.Text Property per Binding an das Viewmodel gebunden ist geht auch einfach

<Textbox Text="{Binding YourProperty, Delay=500}" />

EDIT: http://www.jonathanantoine.com/2011/09/21/wpf-4-5-part-4-the-new-bindings-delay-property/

lg

5.658 Beiträge seit 2006
vor 6 Jahren

Naja ich gehe weniger davon aus das es an der Datenbank liegt sondern das ja bei jedem Tastenanschlag das PropertyChanged Event ausgelöst wird

Du solltest erst messen, dann Vermutungen anstellen, und dann kannst du nach einer möglichen Lösung suchen.

Weeks of programming can save you hours of planning