| 

.NET C# Java Javascript Exception

5
Moin Alle zusammen!
Vielleicht habe ich mal wieder Tomaten auf den Augen...:
Ich rufe in meiner WPF-Anwendung Daten von einem Server ab.
Da die Antwortzeiten manchmal etwas lang sind, möchte ich zuerst eine Meldung "Bitte etwas Geduld..." ausgeben, bevor die SQL-Abfrage abgeschickt wird.
Da beides durch ein und denselben Button-Click initiiert wird, erscheint die Meldung aber zum gleichen Zeitpunkt, wenn auch die abgerufenen Daten angezeigt werden.

- Wie kann ich es erreichen, dass die Meldung sofort angezeigt wird??

Wäre toll, wenn mir jemand einen Tipp geben könnte...!

... mit Dank im Voraus
19.04.2012
Novalis 95 6
2 Antworten
2
Klingt für mich so, als wäre der Serveraufruf im Button-Click vor der Zeile, die die Meldung ausgibt. Dann wird der Serveraufruf blockieren und die nachfolgende Zeile Code erst ausgeführt, wenn die Daten vom Server angekommen sind. Grund hierfür ist, dass die Ausführung des Codes auf dem UI-Thread passiert.

Lösung:
Du solltest den Serveraufruf asynchron ausführen. Damit blockiert dein Serveraufruf nicht mehr und die Meldung wird sofort angezeigt. Etwas moderner (statt einer Meldung) ist die Verwendung eines BusyIndicators; findest Du z.B. im Extended WPF Toolkit.

Viel Erfolg
Florian
19.04.2012
ffordermaier 8,3k 2 9
Hallo Florian,
vielen Dank für Deinen Tipp!! Der BusyIndicator war der Wald, den ich vor lauter Bäumen nicht gesehen habe... ! - Und genau das, was ich eigentlich wollte, aber noch nicht in meiner Toolbox hatte...
Eine Anmerkung noch zu der asynchronen SQL-Ausführung: Ich habe sie ausprobiert, - aber trotz mehrer Versuche keinerlei Daten oder Rückmeldungen vom Server erhalten... Warum ??? - Habe den Grund aus Mangel an Zeit nicht weiter ermitteln können.
Nochmals: Thanx!!
Novalis 20.04.2012
Kann ich aus der Ferne nicht beurteilen. Stell am Besten eine neue Frage, die Beispielcode Deines asynchronen Aufrufs enthält. Dann helf ich bzw. die anderen Dir gerne weiter.
ffordermaier 20.04.2012
Nehm doch einfach den Code hier unten. Der funktioniert. :)
Jens Duczmal 20.04.2012
1
Ich weiss nicht, ob das mit "Kanonen auf Spatzen schiessen ist", aber ich würde einen BackgroundWorker nehmen, um die SQL-Abfrage asynchron abzuschicken.

Vermutlich blockiert die Abfrage die UI-Aktualisierung, weshalb Dein Meldungstext erst angezeigt wird, wenn hier mehr Zeit für ist.

In nachstehendem Code habe ich in meinem ViewModel eine Property "IsWorking", an die ich dann im WPF eine Warteanzeige gebunden habe. Diese ist sichtbar, wenn IsWorking == True ist, sonst unsichtbar. Du kannst aber natürlich auch Deine Meldung "per Hand anzeigen lassen".

Edit: Wie Florian schon schrieb, habe ich einen BusyIndicator an "IsWorking" gebunden. Es steht Dir aber natürlich frei, dies auch anders zu machen, bzw. Meldungstexte einzublenden.

var worker = new BackgroundWorker();

IsWorking = true;
//Oder statt IsWorking zu nehmen, "Bitte um etwas Geduld" irgendwie anzeigen.

worker.DoWork += (sender, args) => {
//Hier SQL-Befehl ausführen
};

worker.RunWorkerCompleted += (sender, args) => {
IsWorking = false;
// Oder alternativ die "Bitte um etwas Geduld"-Meldung per Hand ausblenden
};

worker.RunWorkerAsync();
19.04.2012
Jens Duczmal 2,6k 3 9
Hallo Jens,
auch Dir vielen Dank für Deine Unterstützung!!
Lies mal meinen Kommentar bei Florian...
Schönes stressfreies Wochenende!
Novalis 20.04.2012
...noch einen Nachtrag:
Ich hab´s über eine Animation hingbekommen, mit der ich meine Meldung "Geduld..." gaaanz soft eingeblende, (...damit sich auch sensible User nicht erschrecken...) und dann den SQL Befehl mit animation.completet gestartet.
Novalis
Novalis 23.04.2012
@Novalis: Sei mir nicht böse... Das mag funktionieren, klingt aber nicht nach Best Practice... Acuh wenn ich (im Gegensatz zu Jens) keinen BackgroundWorker verwenden würde(mag einfach am Beispiel liegen), so hat Jens definitiv einen sauberen MVVM Ansatz: BusyIndicator.IsBusy an Property des ViewModels gebunden.
Wenn Du ein eigenes Control+Animation verwenden möchtest, würde ich zuerst schauen, ob ich das per Template bei einem existierenden BusyIndicator hinbekomme und erst danach auf eine eigene Lösung umschwenken, die sich aber dann auch an der gängigen Praxis orientiert.
ffordermaier 23.04.2012

Stelle deine .net-Frage jetzt!