| 

.NET C# Java Javascript Exception

4
Ich habe ein sehr seltsames Phänomen auf Windows 8 Tablets mit meiner Anwendung festgestellt. Die Anwendung habe ich in Visual C# 2013 mit der WPF als Basis geschrieben.

In einem der Fenster gibt es eine TextBox für Artikelnummern, die im KeyDown-Event die gedrückte Taste abfragt. War die gedrückte Taste die Enter-Taste, wird per SQL-Statement in der Tabelle "Aufträge" auf dem SQL Server geprüft, ob ein Auftrag für diesen Artikel vorliegt. Ist das nicht der Fall erscheint eine MessageBox mit dem Hinweis, dass es keine Aufträge dazu gibt. Anschließend findet eine weitere Abfrage auf die Tabelle "Artikel" statt, um alle Informationen der Artikel zu erhalten und anschließend in einem DataGrid anzuzeigen.

Die Funktionalität wird korrekt ausgeführt. Auf meinem Windows 7 Entwicklungs-Rechner dauert es weniger als 1 Sekunde bis das Ergebnis nach dem Klick auf "Ok" der MessageBox erfolgte. Suche ich dieselbe Artikelnummer auf einem Windows 8 oder 8.1 Tablet, dauert es fast 8 Sekunden bis die Ergebnisse erscheinen.

Schließlich fand ich heraus, dass die MessageBox schuld an der Verzögerung ist. Sobald ich die MessageBox im Event aus kommentiere oder in einem anderen Event erzeuge (beispielsweise KeyUp) dauert es in etwa so lange wie auf meinem Entwicklungs-Rechner.
Testweise habe ich mal eine Maus an ein Tablet angeschlossen und den Ok-Button per Mausklick statt Touch-Oberfläche gedrückt. Das hatte aber keine Auswirkungen auf mein Problem.

Kann mir jemand dieses seltsame Verhalten erklären? Oder weiß vielleicht sogar jemand eine Möglichkeit trotzdem eine MessageBox ohne Performanceverlust im selben Event anzuzeigen?

Vielen Dank im voraus!
18.07.2014
SHubertus 10 4
2 Antworten
5
Du wirst wahrscheinlich keine richtige Antwort hier finden, weil Dein Ansatz bereits falsch ist.
Du packst Deine gesamt Logik in die Codebehind Datei, was Deine Anwendung schlecht wartbar und testbar macht.
Bei WPF Anwendungen sollte man auf MVVM aufbauen. Auch hierfür findet man recht gute Projekttemplates für PRISM oder MVVM Light.
Auf ein Return in der TextBox wird dann über ein Command die Aktion im ViewModel angestossen:
<TextBox>
<TextBox.InputBindings>
<KeyBinding Command="{Binding Path=CmdSomething}" Key="Enter" />
</TextBox.InputBindings>
</TextBox>

Im ViewModel oder besser über einen ins ViewModel injizierten DataService erfolgt dann der Zugriff auf die Persistenzschicht (SQL Server).

Durch diese Aufteilung in View, ViewModel, Model und DataService hat Du nun die Möglichkeit ViewModel und Dataservice unabhängig zu testen und zu warten.
Ich bin mir sicher, dass Deine Probleme hier nicht auftauchen würden.

Eventgetriebene Entwicklung in der Codebehind Datei ist ganz ganz böse, wenn man nicht wirklich gerade mal nur eben eine Quick und Dirty und dann wieder Schmeissweg Anwendung entwickeln will.
22.07.2014
judgy 3,0k 1 1 8
"Logik" ist in meiner Anwendung nicht all zu viel vorhanden, aber diese Grundsatzdiskussion will ich jetzt eigentlich nicht führen. MVVM werde ich mir aber auf jeden Fall mal näher ansehen. In meinem Studium kamen solche Implementierungsdetails leider nur oberflächlich und kurz zur Sprache...

Mein Hauptanliegen ist eigentlich zu erfahren, wie es zu so dramatischen Unterschieden zwischen der Abfragezeit bei zwei sehr ähnlichen Rechnern kommen kann.
SHubertus 22.07.2014
+1 für Deinen unermüdlichen missionarischen Einsatz :-)
ffordermaier 22.07.2014
0
@SHubertus: Wie @ffordermaier bereits netterweise angedeutet hat, bin ich hier der MVVM Evangelist auf unserer kleinen, recht bescheidenen Plattform.

Was Du als *Implementierungsdetails* bezeichnest, ist das A&O der Softwareentwicklung.
Es mag sein, dass es ein kleines, nicht zu erwähnendes Implementierungsdetail ist, in einer Wohnung den Lichtschalter für ein Zimmer direkt an der Tür zum Zimmer oder im Zimmer an der Seite mit der Türklinke anzubringen. Wenn Du beim Einzug in die Wohnung aber erkennst, dass Du die Stromleitungen nicht korrekt gelegt hast, hast Du ein Problem.
Architekturpattern wie MVC gibt es zwar schon sehr lange, jedoch haben sie in der NET Welt erst in den letzten Jahren Einzug erhalten (wenn überhabt).
So ist es klar, dass Du an der Uni nur theoretisch von diesen Dingen gehört hast. Die meisten Profs haben wahrscheinlich eh keine (praktische) Ahnung davon.

Aber die Welt dreht sich weiter.
Ich tingele seit vielen Jahren als NET Nomade durch Berliner Firmen und muss erschreckender Weise feststellen, wie viele Entwickler einen Dataset direkt an ein Control anbinden können, aber in Zeiten der Verlagerung auf mobile Devices keinen blassen Schimmer von Client-Server Entwicklung, Layer, Entkoppelung, Modularisierung, Separation of Concern, Clean Code haben. Allein die hungarische Notation lebt in den alten VB6 Entwicklern wahrscheinlich bis zu ihrem Tot weiter.
Es gibt tausende von Duct-Tape Entwicklern, die mit Klebeband ihre Anwendung stricken, aber nur wenige, die sich mit *Implementierungsdetails* wie MVVM, MVC oder MVP auskennen.

Wenn Du ein guter Entwickler sein willst, höre auf, über Events nachzudenken (es sei denn sie sind im Zusammenhang mit dem Mediator Pattern ala EventAggregator oder Messenger).

Und ja, das ist leider alles nicht so einfach, weil Mircosoft selbst hier noch großen Nachholbedarf hat. Aber man sieht ja selbst (schmerzhaft) dort, dass man gerade ganz groß aufräumt (refactored), Abläufe überdenkt und Redundanzen bei den Mitarbeitern korrigiert.
Nicht toll, aber wahrscheinlich unumgänglich.

Nochmal: Dein *Hauptanliegen* ist eine Seifeblase, die platzt, wenn Du erkennst, dass Deine Frage in der Welt von guter Softwareentwicklung wahrscheinlich gar nicht gestellt werden würde.
23.07.2014
judgy 3,0k 1 1 8
Wenn ich jedes mal, wenn ich "A und O der Softwareentwicklung" lese oder höre, 1 € bekäme, wäre ich heute Millionär... :) Wie gesagt, werde ich mich mal mit MVVM beschäftigen. Patterns nutze ich sowieso schon haufenweise, aber MVVM war mir bisher kaum bekannt...

Für DIESES Problem ist es aber auch nicht relevant.
SHubertus 23.07.2014
@ffordermaier: Wie Du leider siehst, kommt meine Mission leider häufig nicht so gut an. Gut, es könnte Zeitverschwendung sein, sich mit Leechern aufzuhalten, aber man sollte nicht den Mut verlieren.
judgy 23.07.2014
@judgy: Nicht beleidigt sein! Ich sehe ja ein, dass MVVM seinen Nutzen hat. Aber mich als Leecher zu bezeichnen, ist auch nicht unbedingt ein Motivator hier mehr zu machen. Mal davon abgesehen, dass ich bisher eher wenig Nutzen von dieser Seite hatte. Aber das ist auch eine Frage der Zeit/Beiträge/Benutzerzahlen...
SHubertus 23.07.2014
@SHubertus: Naja, man investiert hier Stunden über Stunden, die weit über die Beantwortung einfache Fragen hinausgehen. Allein Dir schenke ich mehr als 30 Minuten meines Lebens und was ist Dein Dank? Du bewertest meine Antwort negativ, weil sie Dir nicht gefällt, weil Du lieber weiter hacken statt Software entwickeln willst.
Es ist Dein gutes Recht, aber so wirst Du halt von mir keine weitere Rechenzeit bekommen.
Solange Du Dich hier nicht aktiv beteiligt, bist Du für mich ein Leecher, was sonst?
judgy 23.07.2014
@judgy: Aus "Leechern" werden vielleicht mal aktive User. Aber nicht, wenn man sie gleich zu Anfang abwertet.
Deine Antwort machte auf mich einen Copy and Paste Eindruck und ging (wieder) an meiner eigentlichen Frage vorbei. Deswegen die Abwertung. Was ich "will" ist bei einem konkreten Fall auch nicht relevant. Ich will die Ursache kennen/verstehen. über MVVM wrde ich mich aus Interesse auch informieren. Aber das hilft mir ne diesem Problem nicht
SHubertus 23.07.2014
@judgy: Glaube die Energie kannst Du Dir hier sparen, gegen Beratungsresistenz ist kein Kraut gewachsen.
Xantiva100 23.07.2014
Ich muss dem Fragesteller zustimmen. Die Frage war nicht, wie man es besser machen kann, sondern warum eine Aktion benötigt. Das MVVM-Pattern mag sein Vorteile habe, ich selber nutze es ja auch, aber es war eben nicht Antwort auf die Frage. Wenn ich mit dem Auto in die Werkstatt muss, möchte ich auch nicht hören, dass man mit einem Mercedes besser fährt, sondern ich will, dass das Problem behoben wird. Aber vielleicht kann mir @judgy bei meinem Problem helfen ;-)
lbm1305 23.07.2014
..warum eine Aktion benötigt.. => warum eine Aktion so viel Zeit benötigt
lbm1305 23.07.2014
@IBM1305: *Autofahrer: Mein Auto macht bei 100 km/h ganz laute Klack-Geräusche und man kann sich gar nicht unterhalten. Bei 20 km/h fährt es aber super - Es folgt eine Probefahrt mit Mechaniker - Dann: Mechaniker: Warum benutzen Sie denn nicht die Gangschaltung? Autofahrer: Ach, ist dies keine Automatik? Ja, ich habe mal von dem Prinzip der Gangschaltung gehört, wusste aber nicht, dass es was bringt*
judgy 24.07.2014
LBM1305 => nur Kleinbuchstaben. Aber trotzdem fährt das Auto und es nicht falsch, nur im ersten Gang zu fahren.
lbm1305 24.07.2014
Die Frage ist dann auch...wo kommt das Klack-Geräusch
her?
lbm1305 24.07.2014
@lbm1305: Ist es wichtig zu erfahren, ob das Klack-Geräusch ein Fehler im System ist oder nicht, wenn es doch nur auftaucht, wenn man mit 100 im ersten Gang fährt. Wenn man im fünften Gang fährt, hat man wahrscheinlich keine Klackgeräusche und fertig.
Handelt es hier nicht um eine kindische Bockigkeit?
*Ich will aber die Lösung auf genau meine Frage!*, auch wenn die Antwort gar nicht das eigentliche Problem löst?

Offtopic: So @SHubertus, @lbm1305, @Xantiva100 und Rest. Genug MVVM und Klackgeräusche. Ich muss jetzt Rucksack packen. Morgen früh geht es mit den Kindern nach Irland ..
judgy 24.07.2014
dann erhol dich gut ;-)
lbm1305 24.07.2014
@judgy: Ich gehe den Dingen gerne auf den Grund und versuche sie zu verstehen. Anstatt ein Problem zu lösen einfach etwas ganz anderes zu machen, halte ich für das falsche Vorgehen, vor allem weil sich dann auf Dauer ein richtiger "Berg" an umgangenen Problemen bildet.
Spätestens bei einem Bug in freier Wildbahn bin ich froh bestimmte Marotten/Verhaltensweisen meiner Software genau zu kennen und zu verstehen.
Ohne dieses Wissen besteht auch eine große Chance, dass man bei einem Workaround oder einem komplett neuen Ansatz in dieselben Probleme zu laufen. Das "Allheilmittel" gibt es sowieso nie.
SHubertus 24.07.2014

Stelle deine .net-Frage jetzt!