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
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
[...] 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
Naja ich gehe weniger davon aus das es an der Datenbank liegt sondern das ja bei jedem Tastenanschlag das PropertyChanged Event ausgelöst wird
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.
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.
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'.
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
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