Guten Abend liebe Community,
ich benötige bei einer Sache mal euer gebündeltes Schwarmwissen zum Thema synchrone Methode/Funktion asynchron aufrufen.
Kurze Erklärung zu meinem Vorhaben:
Vorweg, ich möchte versuchen den BackgroundWorker und die System.Threading.Thread-Klasse zu meiden...
Ich habe eine "normale"/synchrone Methode (dauer ca. 10 Sek., kommuniziert mit nem USB-Gerät).
Diese Funktion rufe ich aus dem UI-Thread auf und somit hängt die Anwendung, soweit so gut.
Da der Benutzer im allgemeinen sehr ungeduldig ist weiß er nicht, was in den 10 Sekunden vor sich geht und erkönnte nervös werden wird nervös.
Aus diesem Grund wollte ich eine 2te Form anzeigen, welche sowas wie "Bitte warten" und eine Progressbar etc. anzeigt.
Da sich diese Loading-Form als modaler Dialog verhalten soll, müsste ich sie mit ShowDialog aufrufen, was sie auch synchron macht.
Somit kann ich die Loading-Form nicht mit ShowDialog anzeigen, dann meine Funktion aufrufen und anschließend die Loading-Form wieder schließen.
Modal, weil ich genau das gleiche Verhalten wie bei ShowDialog möchte: Fenster im Vordergrund der Anwendung, Eingaben gehen erst nach Schließen des Fensters wieder.
Ich könnte zwar einfach ein Label mit "Bitte warten" über alle Steuerelemente legen, aber ich möchte mich gern in die Thematik der asynchronen Programmierung weiter einarbeiten.
Habe mir das hier mal verinnerlicht.
Hier mal mein Code:
Dieser Code stellt mir eine Erweiterungsmethode für die Form-Klasse bereit:
Und da, wo ich meine Methode aufrufe und die Loading-Form anzeigen möchte, mache ich folgendes:
Vom Grundprinzip hab ich das Vorhaben verstanden, allerdings wird meine Methode erst nach beenden der Form ausgeführt, vermutlich nur ein Denkfehler.
Oder komme ich so nicht zu meinem gewünschten Ergebnis, sondern muss eins der beiden doch in ein separaten Thread/Backgroundworker auslagern?
Vielen Dank für eure Antworten!
ich benötige bei einer Sache mal euer gebündeltes Schwarmwissen zum Thema synchrone Methode/Funktion asynchron aufrufen.
Kurze Erklärung zu meinem Vorhaben:
Vorweg, ich möchte versuchen den BackgroundWorker und die System.Threading.Thread-Klasse zu meiden...
Ich habe eine "normale"/synchrone Methode (dauer ca. 10 Sek., kommuniziert mit nem USB-Gerät).
Diese Funktion rufe ich aus dem UI-Thread auf und somit hängt die Anwendung, soweit so gut.
Da der Benutzer im allgemeinen sehr ungeduldig ist weiß er nicht, was in den 10 Sekunden vor sich geht und er
Aus diesem Grund wollte ich eine 2te Form anzeigen, welche sowas wie "Bitte warten" und eine Progressbar etc. anzeigt.
Da sich diese Loading-Form als modaler Dialog verhalten soll, müsste ich sie mit ShowDialog aufrufen, was sie auch synchron macht.
Somit kann ich die Loading-Form nicht mit ShowDialog anzeigen, dann meine Funktion aufrufen und anschließend die Loading-Form wieder schließen.
Modal, weil ich genau das gleiche Verhalten wie bei ShowDialog möchte: Fenster im Vordergrund der Anwendung, Eingaben gehen erst nach Schließen des Fensters wieder.
Ich könnte zwar einfach ein Label mit "Bitte warten" über alle Steuerelemente legen, aber ich möchte mich gern in die Thematik der asynchronen Programmierung weiter einarbeiten.
Habe mir das hier mal verinnerlicht.
Hier mal mein Code:
Dieser Code stellt mir eine Erweiterungsmethode für die Form-Klasse bereit:
C#-Quellcode
- public static Task<DialogResult> ShowDialogAsync(this Form self)
- {
- if (self == null)
- throw new ArgumentNullException( "self" );
- TaskCompletionSource<DialogResult> completion = new TaskCompletionSource<DialogResult>();
- var selfHandle = self.Handle;
- self.BeginInvoke( new Action( () => completion.SetResult( self.ShowDialog() ) ) );
- return completion.Task;
- }
Und da, wo ich meine Methode aufrufe und die Loading-Form anzeigen möchte, mache ich folgendes:
Vom Grundprinzip hab ich das Vorhaben verstanden, allerdings wird meine Methode erst nach beenden der Form ausgeführt, vermutlich nur ein Denkfehler.
Oder komme ich so nicht zu meinem gewünschten Ergebnis, sondern muss eins der beiden doch in ein separaten Thread/Backgroundworker auslagern?
Vielen Dank für eure Antworten!
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „TRiViUM“ ()