Async ShowDialog
Bin ich mit async/await asynchron laden meine Daten aus der Datenbank und während des Ladevorgangs, ich möchte ein popup laden der form, es ist nur ein einfaches Formular mit laufendem Fortschrittsbalken, um anzuzeigen, dass es einen Laufenden Prozess. Nachdem die Daten geladen wurden, wird der dialog automatisch geschlossen werden. Wie kann ich das erreichen ? Unten ist mein Aktueller code:
protected async void LoadData()
{
ProgressForm _progress = new ProgressForm();
_progress.ShowDialog() //not working
var data = await GetData();
_progress.Close();
}
Aktualisiert:
Habe ich es geschafft, es funktioniert durch die änderung der code:
protected async void LoadData()
{
ProgressForm _progress = new ProgressForm();
_progress.BeginInvoke(new System.Action(()=>_progress.ShowDialog()));
var data = await GetData();
_progress.Close();
}
Ist das der richtige Weg oder gibt es keine besseren Möglichkeiten ?
Vielen Dank für Ihre Hilfe.
- Ihre aktualisierte Lösung eine mögliche race-condition;
GetData
könnte theoretisch abgeschlossen sein, bevor das Dialogfeld wird immer angezeigt; so würde es auf dem Bildschirm bleiben auf unbestimmte Zeit (oder, wahrscheinlicher, Sie würde eineObjectDisposedException
). - Brauchen Sie das Formular modal sein?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist einfach zu implementieren mit
Task.Yield
wie diese (WinForms, kein exception-handling, für die Einfachheit):Es ist wichtig zu verstehen, wie die Ausführung flow springt über eine neue verschachtelte message-loop (d.h. der modal-dialog), und dann geht zurück auf die original-Nachricht-Schleife (das ist, was
await progressFormTask
ist für).Hier ist ein Formular, das verwendet Aufgabe.ContinueWith und sollten vermeiden, irgendwelche race-condition mit Ihrer Nutzung der modal ProgressForm:
ShowDialog()
ist ein blockierender Aufruf; wird die Ausführung nicht Vorausawait
Anweisung, bis das Dialogfeld geschlossen ist, durch den Benutzer. VerwendenShow()
statt. Leider ist dein dialog nicht modal sein, aber es wird richtig verfolgen Sie den Fortschritt des asynchronen Betrieb.Können Sie Folgendes versuchen: