Ich arbeite mit einem WinForm, von dem alle Prozesse gesteuert werden, die ich brauche. Jetzt versuche ich eine BackgroundWorker
mit einer ProgressBar
und eine Abbrechen-Schaltfläche in meinen Code zu integrieren. Ich möchte, dass es lokal um meinen Code geht und nicht in einer separaten Methode. Um dies zu testen, wird ein neues Formular mit einer Fortschrittsleiste (noch nicht aktiv) und einer Schaltfläche zum Stoppen einer for-Schleife erstellt. Der Code funktioniert jedoch nicht (und der Fortschrittsbalken ist noch nicht einmal enthalten). Das Formular friert sofort ein (siehe Bild), daher kann ich den Abbrechen-Button nicht testen. Die for-Schleife wird jedoch ausgeführt und "Done: " + l.ToString()
wird angezeigt. Wie kann ich das lösen?Formular einfrieren mit BackgroundWorker
void stopMeasurement(object sender, EventArgs e)
{
stopMeas = true;
}
public void testcancel() // Test method which is triggered manually
{
int l = 0;
MetingProgress metingProgress = new MetingProgress();
metingProgress.btnCancelmeting.Click += new EventHandler(stopMeasurement);
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = true;
worker.DoWork += (sender, args) =>
{
for (int k = 0; k < 10; k++)
{
Thread.Sleep(1000);
l++;
if (worker.CancellationPending)
break;
}
MessageBox.Show("Done: " + l.ToString());
};
worker.RunWorkerAsync();
while (worker.IsBusy)
{
if (stopMeas)
worker.CancelAsync();
}
metingProgress.Dispose();
MessageBox.Show("All done");
}
Ja, ich habe bereits meinen Code für die verschiedenen Aufgaben, die in den Hintergrundarbeiter gehen müssen, also würde ich gerne ein Setup wie in meinem Beispiel haben. Die for-Schleife ähnelt den Aufgaben, die ausgeführt werden sollen. – 10a
ok Ich sehe, dann 'testcancel' ist eigentlich eine Methode, einfach den Thread auszulösen und es im Hintergrund laufen zu lassen, und das ist eigentlich nur zu tun.Da der Thread länger laufen wird, solltest du wirklich nicht versuchen das Formular bei dieser Methode zu entfernen! es wäre die Aufgabe der Thread-Methode. auch die 'MessageBox.Show (" All done ");' -Zeile gehört in das 'DoWork'-Ereignis, da eigentlich nur der Thread selbst weiß, wann der Job erledigt ist, nicht die Methode, die den Thread –