thevo1d
Goto Top

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:

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);
Versuch 1: Temporäre Unterbindung des Ablaufs durch "Thread.Sleep"


// in der if Abfrage
this.Enabled = false;
wait();

// Als separate Funktion
public async void wait()
{
    await Task.Delay(5000);
    this.Enabled = true;
}
Versuch 2: Temporäre Unterbindung des Ablaufs durch "Async" - "Task.Delay"

// 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]);
}
Versuch 3: Das öffnen & Warten in einer anderen Form

Content-Key: 356497

Url: https://administrator.de/contentid/356497

Printed on: April 28, 2024 at 18:04 o'clock

Member: Kraemer
Kraemer Nov 29, 2017 at 10:39:02 (UTC)
Goto Top
Member: SeaStorm
Solution SeaStorm Nov 29, 2017 at 12:34:41 (UTC)
Goto Top
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.
Member: TheVo1d
TheVo1d Nov 29, 2017 at 12:44:41 (UTC)
Goto Top
Vielen Dank!
Ich werde mich mal darüber informieren.
Ich melde mich erneut ob mir das ganze geholfen hat.
Member: TheVo1d
TheVo1d Nov 29, 2017 at 15:46:42 (UTC)
Goto Top
Besten Dank!
Ich glaube ich verstehe nun wo der Fehler liegt.
Ich blicke bei dem Multithreading zwar noch nicht ganz durch,
aber zumindest weiss ich nun wo ich Anfangen kann.

Vielen Dank

TheVo1d