Laden...

[erledigt] UI wartet auf Task --> Wie Nutzereingabe verwalten/behandeln

Erstellt von Schleifer vor 12 Jahren Letzter Beitrag vor 12 Jahren 746 Views
S
Schleifer Themenstarter:in
24 Beiträge seit 2011
vor 12 Jahren
[erledigt] UI wartet auf Task --> Wie Nutzereingabe verwalten/behandeln

Hallo,

ich sehe wohl gerade den Wald vor lauter Bäumen nicht und hoffe auf eure Hilfe.

Kurze, vereinfachte Erklärung was ich mache:

GUI für Nutzereingabe und anschliessender Datenbank-Operation und das a la Wizard. Datenbank-Operationen führe ich als Task aus. An einer gewissen Stelle muss ich dann auf das Ergebnis der Task zu greifen - also evtl. warten. (z.B. um weitere Nutzereingaben validieren zu können.)

Mein Problem ist, dass wenn gewartet wird, Nutzereingaben (z.b. unnötigerweise mehrfaches ENTER drücken) in eine Art Warteschlange laufen und sozusagen "nach Task.Result ausgeführt" werden. Da die GUI hauptsächlich per Tastatur zu steuern ist, was viel TAB und und vorallem ENTER bedarf, werden so auch mögliche (Fehler-)Meldungen quasi weggedrückt.

Wie kann ich diese Nutzereingaben verhindern?

so etwas wie:

private void Window_KeyDown(object sender, KeyEventArgs e)
{
   //Task noch nicht fertig
   e.Handled = true;
}

erscheint mir dann doch etwas hart. Auch ein disablen aller Controls scheint mir zu hart. Ich vermute, dass ich eher umdenken sollte.

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Schleifer,

in der GUI solltest du wegen [FAQ] Warum blockiert mein GUI? nie warten, auch nicht auf Tasks. Wenn du das Ergebnis des Tasks in der GUI brauchst, dann erstell eine Continuation mit dem Taskscheduler.FromCurrentSynchronizationContext - od. wie in [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) beschrieben, aber nie warten auf das Ende des asynchronen Vorgangs, denn das blockiert die UI und du köntnest gleich snychron arbeiten.

Wie kann ich diese Nutzereingaben verhindern?

Wenn du einfach das handeld auf true setzt, wird das wohl die User eher verwirren, als es hilft. Das Deaktivieren der Controls ist da schon sinnvoller und wenn du eh WPF verwendest ist das einfach per Binding an eine boolsche-Eigenschaft möglich.

Sonst gibts auch Busyindicatoren, etc. Was für deine Anwendung passt kannst du auch mit den Kunden gemeinsam entscheiden.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

S
Schleifer Themenstarter:in
24 Beiträge seit 2011
vor 12 Jahren

Vielen Dank für deine Antwort.

ich komme mir gerade blöd vor. selbst beim schreiben/lesen des themas ist mir mein fehler nicht bewusst geworden.