Windows Form Function - Form kann nicht komplett geladen werden - Auslastung des Programmes - C-Sharp
Hallo Zusammen
Mein Problem ist wie folgt. Ich arbeite gerade an einem Tool welches eine SQL Datenbank auf Fehler überprüft, demnach sind es sehr viele Daten.
Nun habe ich eine Funktion" geschrieben welche viele der Zellen abgleicht, da dies eine Weile dauern kann wollte ich einen "Progressbar" in einer Form öffnen und diesen über die Funktion updaten. Als ich nun die form am Anfang der Funktion öffne lädt es im nur die leere mit 3 helleren weissen Streifen welche der Inhalt wären.
Daraufhin "freezed" das Programm dann auch, also nicht im Sinne von es Stürzt ab, sondern es ist einfach stark ausgelastet und deshalb kann man nichts mehr am Programm unternehmen. Nun habe ich verschiedenes versucht die Form im voraus anzeigen zu lassen. Ich habe es bereits mit: dem öffnen in einer anderen Form, einer "System.Threading.Thread.sleep" und mit einem async "await Task.Delay".
Gibt es eine andere Möglichkeit die Form im voraus zu öffnen? Und/Oder kann ich dieses Auslasten der Applikation irgendwie unterdrücken?
Vielen Dank im Voraus
TheVo1d
Codestücke/ Weitere Details:
Ich rufe die Funktion aus einer normalen if-Abfrage auf.
In der Funktion selber rufe ich die form auf und erhöhe den Fortschritt über eine Public int Variable welche ich erhöhe.
Meine bisherigen Versuche:
Versuch 1: Temporäre Unterbindung des Ablaufs durch "Thread.Sleep"
Versuch 2: Temporäre Unterbindung des Ablaufs durch "Async" - "Task.Delay"
Versuch 3: Das öffnen & Warten in einer anderen Form
Mein Problem ist wie folgt. Ich arbeite gerade an einem Tool welches eine SQL Datenbank auf Fehler überprüft, demnach sind es sehr viele Daten.
Nun habe ich eine Funktion" geschrieben welche viele der Zellen abgleicht, da dies eine Weile dauern kann wollte ich einen "Progressbar" in einer Form öffnen und diesen über die Funktion updaten. Als ich nun die form am Anfang der Funktion öffne lädt es im nur die leere mit 3 helleren weissen Streifen welche der Inhalt wären.
Daraufhin "freezed" das Programm dann auch, also nicht im Sinne von es Stürzt ab, sondern es ist einfach stark ausgelastet und deshalb kann man nichts mehr am Programm unternehmen. Nun habe ich verschiedenes versucht die Form im voraus anzeigen zu lassen. Ich habe es bereits mit: dem öffnen in einer anderen Form, einer "System.Threading.Thread.sleep" und mit einem async "await Task.Delay".
Gibt es eine andere Möglichkeit die Form im voraus zu öffnen? Und/Oder kann ich dieses Auslasten der Applikation irgendwie unterdrücken?
Vielen Dank im Voraus
TheVo1d
Codestücke/ Weitere Details:
if (frm.cbx_WService.Checked == true)
{
tblFilter = frmFunc.ServicesCheck(tblFilter, lstTables[2], lstTables[1]);
}
Ich rufe die Funktion aus einer normalen if-Abfrage auf.
// Aufrufen der Form & zuweisen des Maximalen Wertes des Progressbars
frm_WorkInProgress frmWIP = new frm_WorkInProgress();
frmWIP.intMaximum = 10;
// Öffnen der Form
frmWIP.show();
// den Fortschritt erhöhen
frmWIP.intProgress++;
In der Funktion selber rufe ich die form auf und erhöhe den Fortschritt über eine Public int Variable welche ich erhöhe.
Meine bisherigen Versuche:
frm_WorkInProgress frmWIP = new frm_WorkInProgress();
frmWIP.intMaximum = 10;
frmWIP.show();
System.Threading.Thread.Sleep(5000);
// in der if Abfrage
this.Enabled = false;
wait();
// Als separate Funktion
public async void wait()
{
await Task.Delay(5000);
this.Enabled = true;
}
// In einer anderen Form
if (frm.cbx_WService.Checked == true)
{
frm_WorkInProgress frmWIP = new frm_WorkInProgress();
frmWIP.Show();
System.Threading.Thread.Sleep(5000);
tblFilter = frmFunc.ServicesCheck(tblFilter, lstTables[2], lstTables[1]);
}
Please also mark the comments that contributed to the solution of the article
Content-Key: 356497
Url: https://administrator.de/contentid/356497
Printed on: May 8, 2024 at 04:05 o'clock
4 Comments
Latest comment
Hi
dein Problem nennt sich MultiThreading. Dein Programm startet die Form in einem Thread. Die Form wiederum startet beim Laden sofort deine Funktion, die ne Weile irgendwelche Dinge macht. Bis dieses nicht durch ist, wartet die Form. Entsprechend aktualisiert die Form sich auch nicht.
Mit DoEvents() kannst du zwar "manuell" sagen, das die Form sich mal aktualisieren soll, aber das ist keine sonderlich tolle Lösung.
Du musst deine Funktion also in einen neuen Thread packen.
Gibt da verschiedene Varianten. Die üblichste bei C# ist wohl der Backgroundworker, der auch gleich eine Unterstützung für Progressbars usw mitbringt.
dein Problem nennt sich MultiThreading. Dein Programm startet die Form in einem Thread. Die Form wiederum startet beim Laden sofort deine Funktion, die ne Weile irgendwelche Dinge macht. Bis dieses nicht durch ist, wartet die Form. Entsprechend aktualisiert die Form sich auch nicht.
Mit DoEvents() kannst du zwar "manuell" sagen, das die Form sich mal aktualisieren soll, aber das ist keine sonderlich tolle Lösung.
Du musst deine Funktion also in einen neuen Thread packen.
Gibt da verschiedene Varianten. Die üblichste bei C# ist wohl der Backgroundworker, der auch gleich eine Unterstützung für Progressbars usw mitbringt.