Laden...

Wie Fortschrittsanzeige für StoredProcedure? (BackgroundWorker, Timer)

Erstellt von ThoHei vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.375 Views
T
ThoHei Themenstarter:in
82 Beiträge seit 2011
vor 12 Jahren
Wie Fortschrittsanzeige für StoredProcedure? (BackgroundWorker, Timer)

Hallo,

ich habe nun schon viel gesucht, aber noch nichts wirklich hilfreiches gefunden.

Ich habe eine StoredProcedure auf einem MySQL 5 Server geschrieben.

Diese stellt mir ein Abfrageergebnis aus mehreren Tabellen zusammen.

Diese werden dann an einen MySqlDataReader übergeben und mit dem wird dann ein DataGridView gefüllt.

Das funktioniert auch alles prima. Auf meinem lokalen System ist das auch alles kein Problem.

Jedoch liegt der SQL Server im Netz und unsere Firmenleitung ist nicht wirklich performant.

So das es bei größernen Abfragen bis zu 20 -30 Sekunden dauern kann ehe ein Ergenbis ausgegeben wird.

Nun wollte ich das ganze in einem Backgroundworker machen. Das hat auch funktioniert nur leider friert bekannter maßen die GUI ein und das ist für User natürlich nicht schön.

Nun habe ich ein ProgressBar in meine GUI implementiert und wollte nun auf diese zugreifen und eine Fortschritsanzeige ausgeben, damit der User sieht das was passiert.


void bw_DoWork(object sender, DoWorkEventArgs e) 
    	{ 
        	MdlDatabase db = new MdlDatabase("mysql");
        	Console.WriteLine(this.ProjectCapt);
        	String[,] myParams = new string[2,2] {{"projectNr",this.Project},{"capt",this.ProjectCapt}};
        	this.Reader = db.StoredProcedure_Array("view_sel",myParams);
        	this.sCont.Cursor = Cursors.WaitCursor;
		}

void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    	{ 
        	UserControl frmAuct = new AuctionCtrl (sCont,progBar, this.ProjectId, this.ProjectDesc, this.Project, this.ProjectCapt, this.Reader);
        	ShowForm(frmAuct);
        	this.sCont.Cursor = Cursors.Default;
    	}

Und die SQl Methode


public MySqlDataReader StoredProcedure_Array(string procedure,string[,] viewParams) {
			MySqlCommand comm = new MySqlCommand(procedure,conn);
			for(int i = 0; i < viewParams.GetLength(0); i++) {
				comm.Parameters.Add (new MySqlParameter ("?"+viewParams[i,0], MySqlDbType.VarChar, 15)).Value = viewParams[i,1];
			}
			comm.CommandType = CommandType.StoredProcedure;
			MySqlDataReader reader;
			try {
				reader = comm.ExecuteReader(CommandBehavior.Default);
				return reader;
			} catch (MySqlException mEx) {
				MessageBox.Show("Fehler in der Abfrage:" + Environment.NewLine + procedure + Environment.NewLine + mEx,"Abfragefehler",MessageBoxButtons.OK,MessageBoxIcon.Warning);
				return null;
			} 
			
		}

Wie kann ich die StoredProcedure so überwachen, dass ich die ProgressBar anzeigen lassen kann.

3.430 Beiträge seit 2007
vor 12 Jahren

Hallo ThoHei,

um die Progressbar wirklich sinnvoll nutzen zu können muss man wissen wie lange der Vorgang dauert.
z.B. bei einem Download ausrechnen wie viele % von den gesamten Bytes gedownloaded wurden

In deinem Fall ist das wahrscheinlich nicht möglich => Its done when it's done 😃
Deshalb ist es da wohl das einfachste wenn du einfach die Progressbar auf Marquee setzst, dann hast die diese Standard-Animation welche meist verwendet wird wenn man nicht weiß wie lange es dauert 😃

PS: Du hast ziemlich oben geschrieben dass die GUI einfriert.
Was hast du damit gemeint? Weil wenn du es in einen Backgroundworker oder Thread auslagerst muss der GUI Thread ganz normal weiterlaufen

Gruß
Michael

T
ThoHei Themenstarter:in
82 Beiträge seit 2011
vor 12 Jahren

Hallo michlG,

danke damit habe ich zumindest eine kleine Interaktion.

Die GUI friert für ca. 2-3 Sekunden ein. Das sieht man auch daran, dass die Progressbar keine Fortschritte mehr macht.

3.430 Beiträge seit 2007
vor 12 Jahren

Hallo ThoHei,

Die GUI friert für ca. 2-3 Sekunden ein. Das sieht man auch daran, dass die Progressbar keine Fortschritte mehr macht.

So lange darf die GUI nicht einfrieren.
Da ist was mit deinem BackgroundWorker faul, weil wenn der User in diesen 2-3 Sekunden rumklickt dann hängt sich die Anwendung total auf (Programm reagiert nicht mehr).

Guck mal nach was da so lange dauert.
Ist da etwas was in bw_RunWorkerCompleted mehrere Sekunden beansprucht.
Häng dich mal mit einen Profiler rein, dann kriegst du raus welche Methode wie lange dauert.

Weil der GUI-Thread darf nie blockiert werden, sonst kommt es zu Problemen

Gruß
Michael