Anzeige der Fortschritt der Ausführung durch Fortschrittsbalken
Ich habe ein dummes problem, aber ich komme nicht weiter. Ich bin ausführen einer gespeicherten Prozedur mit meinem code
Prozedur nimmt Zeit also für dieses ich bin, die Anzeige einer progress bar zeigt den Fortschritt der Ausführung, aber die gespeicherte Prozedur ausgeführt, und es gibt nichts, zu dem ich, erhöht sich der Wert der progress bar.
Dies ist mein code
void btnYes_Click(object sender, EventArgs e)
{
if (DialogResult.Yes == MessageBox.Show("Are you sure", "", MessageBoxButtons.YesNo))
{
try
{
dbDataEntities db = new dbDataEntities();
string myquery = "DECLARE @return_value int EXEC @return_value = [dbo].[ssspUpdateMarksOfStudent] SELECT 'Return Value' = @return_value";
//progressbar1.Maximum = 5000;
//progressbar1.value = ?; //how could i increment it
//
db.Database.ExecuteSqlCommand("myquery");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
Auch ich versuchen, es zu tun mit der Stoppuhr durch den aktuellen Wert, die nicht Inkrementieren, während die Durchführung von Verfahren
Stopwatch st = new Stopwatch();
st.Start();
progressbar1.Maximum = 5000;
progressbar1.Value = Convert.ToInt16(st.Elapsed.Seconds);
//My stored procedure call
st.Stop();
so ist, es kann nur getan werden indem mit background worker
oder gibt es eine andere Möglichkeit, dies zu tun?
Ich bin neu in der Programmierung so nicht verwenden background worker
viel also ich bin auf der Suche nach einer alternative.
Bitte vorschlagen. Vielen Dank im Voraus.
die Optimierung der gespeicherten Prozedur?? nicht bekommen, können Sie bitte erklären
ich meinte nur ist es eine Möglichkeit können Sie Ihre gespeicherte Prozedur ausführen, schneller - der Umgang mit den root-Problem. Vielleicht ist es nicht möglich, aber vielleicht lohnt. Zum Beispiel können Sie fügen Sie einige Indizes für Ihre Datenbank, damit es schneller läuft. Schwer zu sagen ohne es zu sehen, wenn
problem ist nicht mit meinem gespeicherten Prozedur .. das problem ist ich kann nicht die Anzeige der Fortschritt der Ausführung durch Fortschrittsbalken
Gibt es eine iteration in der gespeicherten Prozedur verwenden? Gibt es eine Möglichkeit, um die drop-wählen Sie eine mit einem integer-Wert von der SP?
InformationsquelleAutor Co. Aden | 2013-11-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine lustige Idee
SqlConnection
bietetInfoMessage
Ereignis, das feuert, wenn der server führt einePRINT
Befehl. Sie können drucken, die in einigen teilen der gespeicherten Prozedur und hören zu dieser Veranstaltung.anderes, als dass die Verwendung von @ - Weiler-hakobyan 's Lösung. nur zeigen Sie einen unendlichen progress bar.
Update: Aktualisiert, um eine vollständige Lösung
Erste von allen, ich hasse volle Antworten. Es verhindert, dass der Geist die Fähigkeit, eine Lösung zu finden. Stattdessen möchte ich die Leute dazu bringen in die richtige Pfad, so können Sie den Weg gehen.
Aber hier ist es sowieso. Getestet mit VS2012, NET4, MSIL unter W7x64SP1 und SQL2012.
Meine sehr zeitaufwendig SP. Verwendet
RaisError
stattPrint
zum senden von Nachrichten sofort.Und meine form mit
CallSpButton
)progress
)statusLabel
) undSpCaller
) mitWorkerReportsProgress
settrue
.Endlich der code, der macht den call
UI stecken, weil Sie verwendet werden
BackgroundWorker
falsch. Nachdem Sie angerufen habenRunWorkerAsync
Sie laufen immer noch ein code, bis Arbeiter abgeschlossen. Sollten Sie einen anderen timer zu aktualisieren, den Fortschritt-bar, und verwenden SieRunWorkerCompleted
verfolgen Abschluss.Wie ich bereits in meiner Frage, ich bin nicht mit hintergrund-worker-also ohne Verwendung Ui zu stecken
Ich aktualisiert meine Antwort mit vollständiger Lösung.
InformationsquelleAutor edokan
Sieht es aus wie Sie die gespeicherte Prozedur auf dem gui-thread.
Dass bedeutet, dass Ihre Anwendung wird nicht reagiert, während der Aufruf ausgeführt wird, als die Meldung Pumpe blockiert ist. Das ist wahrscheinlich eine schlechte Idee. Ich würde empfehlen, Sie alle lang Laufenden Aufrufe von einem anderen thread.
Hintergrund-Worker ist eine Klasse entworfen, um dies zu tun, um Ihnen zu erlauben, Bericht zu erstatten, wie eine lange laufende Aufgabe ist, so können Sie die Aktualisierung der Benutzeroberfläche, aber als Ihre Aufgabe, ist nur ein Element, gibt es nicht viel zu berichten, so ist es vielleicht nicht die richtige Wahl für Sie.
Vielleicht möchten Sie etwas von der form (erraten, die syntax, wie ich nicht über einen compiler zur hand) und die Kreditaufnahme aus Windows Forms-ProgressBar: Einfachste Weg, um start/Stopp-Festzelt?
ReportProgress
undProgressChanged
Methoden der BackgroundWorker zu Inkrementieren eines regelmäßigen ProgressBar?Ja, wenn Sie lange laufende Aufgabe hat, die stellen, wo es Sinn machen würde den Fortschritt melden, rufen Sie ReportProgress auf den worker-thread und ProgressChanged-Ereignisse werden ausgelöst, die auf dem UI-thread. Ich denke, dass müssen Sie explizit aktivieren. Lesen Sie die Dokumentation im Hintergrund Arbeitnehmer können die Ihnen zeigen, wie Sie es tun: msdn.microsoft.com/en-us/library/...
Es gibt keinen Grund für die Verwendung der BackgroundWorker-Klasse, wenn Sie verwenden können, Aufgaben. Es bietet nichts über die Kombination von Aufgabe.Run/IProgress<> während es erfordert viel mehr code, ist schwerer und kann nicht bieten, keine Fortschritte über eine einfache Nummer
Danke @PanagiotisKanavos ich hatte nicht bemerkt das neue IProgress<> interface, das sieht viel sauberer als hintergrund-Arbeiter.
InformationsquelleAutor jaquesri
Gespeicherte Prozeduren sind keine Fortschritte zu informieren. Sie können
ProgressBar
imMarquee
Stil Einstellung ProgressBar.Style-Eigenschaft zu ProgressBarStyle.FestzeltInformationsquelleAutor Hamlet Hakobyan
Folgen Sie bitte diese Methode.
Berechnen Sie zuerst die Zeit, die zum ausführen der gespeicherten Prozedur.
db.Database.ExecuteSqlCommand("myquery");
geben Sie hier den code
Weisen einen separaten thread/(Teil des Prozesses), die für die Ausführung dieser Abfrage. mithilfe der hintergrund-worker control in c# (in do_work Event)
ebenso weisen Sie einen separaten Prozess thread mit einem hintergrund-Arbeiter für die Anzeige des Fortschritt-bar-status.(- in-Progress-Changed-Ereignis) nur Inkrement-Wert von 10%. geben Sie einige kleine schlafen (basierend auf der Zeit zu verbrauchen Abfrage unterteilen es in zehn Teile).
Nach Abschluss Progressbar machen.Wert=100 (im Run-Arbeiter-CompletedEvent)
Rufen Sie bitte beide thread an meine Zeit in
backgroundWorker1.RunWorkerAsync();
Ich denke, das löst dein Problem.
InformationsquelleAutor Mark Macneil Bikeio
Ich studierte Hintergrund Arbeiter und so mache ich es
Lege ich die Ausführung meines Verfahrens in einem anderen thread und Statusanzeige im GUI-thread
Wo DoWork ist
InformationsquelleAutor Co. Aden