Update-Fortschrittsbalken in anderer form während der task ausgeführt wird
**Letztlich werde ich haben vier Aufgaben gleichzeitig ausgeführt und haben eine andere form, die enthält vier Balken. Ich möchte für jede Fortschrittsbalken zu aktualisieren, wie es die Arbeit abschließen.
Hier ist, was ich versuche zu tun, für den Anfang.
Ich habe ein Formular mit einigen Tasten auf. Wenn ich auf ein ich bin die Erstellung einer neuen Aufgabe um einige Arbeit zu tun.
public partial class MyMainForm : Form
{
private void btn_doWork_Click(object sender, EventArgs e)
{
Task task = new Task(RunComparisons);
task.Start();
}
private void RunComparisons()
{
int progressBarValue = 0;
MyProgressBarForm pBar = new MyProgressBarForm(maxValue, "some text");
pBar.ShowDialog();
foreach(string s in nodeCollection)
{
//do some work here
progressBarValue++;
pBar.updateProgressBar(progressBarValue, "some new text");
}
pBar.BeginInvoke(new Action(() => pBar.Close()));
}
}
In eine Klasse, die enthält ein Formular mit einem Fortschrittsbalken:
public partial class MyProgressBarForm : Form
{
public MyProgressBarForm(int maxValue, string textToDisplay)
{
InitializeComponent();
MyProgressBarControl.Maximum = maxValue;
myLabel.Text = textToDisplay;
}
public void updateProgressBar(int progress, string updatedTextToDisplay)
{
MyProgressBarForm.BeginInvoke(
new Action(() =>
{
MyProgressBarControl.Value = progress;
myLabel.Text = updatedTextToDisplay;
}));
}
Wenn ich auf die doWork-Taste der Fortschrittsbalken form zeigt, aber nicht aktualisieren. Es sitzt nur da und hängt. Wenn ich kommentiere die pBar.ShowDialog(); dann wird der Fortschrittsbalken Formular nicht angezeigt wird, aber die Arbeit getan werden, bis zum Abschluss ausgeführt wird perfekt.
Hatte ich dieses perfekt funktioniert, wenn ich Schaffe meine eigenen threads, aber ich lese über Aufgaben und jetzt bin ich versucht, diese zu führen, dass Art und Weise. Wo habe ich bloß falsch gemacht?
würden Sie zufällig ein Beispiel dafür?
Haben Sie sich überlegt mit einem BackgroundWorker? Es scheint ein guter Anwendungsfall
InformationsquelleAutor UmarSlobberknocker | 2015-02-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstellen Sie Ihre Fortschritte bar-Formular auf der Haupt-UI-thread, der das übergeordnete Formular, dann rufen Sie die
Show()
Methode auf das Objekt in der Schaltfläche click-Ereignis.Hier ist ein Beispiel mit 2 bars:
Es gibt eine Reihe von Möglichkeiten, um zu erreichen, dass. Eine Möglichkeit ist eine neue Methode in MyProgressBarForm, setzt neue max für eine gegebene Fortschrittsbalken, und dann rufen Sie Sie, bevor Sie die Aktualisierung starten (Wenn Sie nicht tun dies auf dem UI-thread, würden Sie brauchen, um wieder aufrufen).
Es habe! Funktioniert Super! Vielen, vielen Dank!
Frage. Als ich mit meinem vergleichen Sie die Funktionalität von einem thread, den ich erstellt mein Programm lief unglaublich schnell, aber jetzt habe ich es mit als eine Aufgabe, es dauert ewig dauern. Ist eine Aufgabe, die viel langsamer als ein tread?
Siehe diese Frage. Auch, sollten Sie wirklich beginnen, eine neue Frage.
InformationsquelleAutor Setsu
Den TPL fügt die
IProgress
Schnittstelle für die Aktualisierung der Benutzeroberfläche, die den Fortschritt eines lang andauernden nicht-UI-Betrieb.Alles, was Sie tun müssen, ist erstellen Sie eine
Progress
Instanz in Ihrer Benutzeroberfläche mit Anweisungen, wie Sie aktualisieren Sie es mit dem Fortschritt, und dann übergeben Sie es an Ihre Arbeiter, die berichten können, die Fortschritte durch Sie.Diese Weise können Sie den Fortschritt Form-Griff Bearbeitung der Benutzeroberfläche, den funktionierenden code zu verarbeiten nur die Arbeit machen, die wichtigste form, um einfach den Fortschritt zu bilden, die Arbeit beginnen, und schließen Sie das Formular, wenn Sie fertig sind, und es lässt all die Arbeit, die Verfolgung des Fortschritts und marhsaling durch den UI-thread zu
Progress
. Es vermeidet auch, dass mehrere UI-thread; Ihre aktuelle Ansatz der Erstellung und Manipulation von UI-Komponenten, die aus nicht-UI-threads erstellt eine Reihe von Problemen, verkompliziert den code und macht es schwieriger zu pflegen.TPL
hat die MöglichkeitProgress
. Dies sollte akzeptiert werden Antwort.Wie würde ich dynamisch übergeben Sie die progressBar-maximum auf den MyProgressBarForm? Ich habe versucht, erstellen Sie eine Methode in MyProgressBarForm, in dem aufgerufen wird, wird aus Form1, legen Sie die progressBar-maximum. Wenn ich es mache, bekomme ich eine Fehlermeldung über einen anderen thread den Zugriff auf die form-Fehler. Ich weiß, was es verursacht aber ich weiß nicht, eine Arbeit um. Irgendwelche Gedanken würde sehr geschätzt werden.
InformationsquelleAutor Servy
.ShowDialog
ist ein blockierender Aufruf; die Ausführung nicht fortsetzen, bis der dialog ein Ergebnis zurückgibt. Sie sollten wahrscheinlich suchen, um in eine BackgroundWorker, das Werk zu Bearbeiten, die auf einem anderen thread, und aktualisieren Sie den dialog.Ich denke, er meint einfach im Stich die Aufgabe Herangehen und tun Sie Ihre Arbeit auf der BackgroundWorker die DoWork-Methode
Ich würde die Arbeit tun, im hintergrund Arbeiter statt einer Aufgabe. Mit dem Task nicht automatisch in Ihr code asynchron.
Naja, letztendlich werde ich haben, nach oben von 4 Aufgaben, die möchte ich alle gleichzeitig laufen. Das ist, warum ich Frage. Ich werde ein Formular mit vier Balken erhalten und möchte jeden Fortschrittsbalken zu aktualisieren, wie jede Arbeit, die Aufgabe ist abgeschlossen.
Mit einem BGW würde einen großen Schritt zurück, es würde den code schon ein bisschen mehr aufgebläht als das, was es eigentlich sein muss. Die TPL ist eine spürbare Verbesserung.
InformationsquelleAutor Bradley Uffner