Discussion:
BackgroundWorker Neustarten
(zu alt für eine Antwort)
Andre G.
2006-11-18 11:15:20 UTC
Permalink
Hallo zusammen,
ich versuche gerade Daten aus einer Datenbank über einen BackgroundWorker zu
laden.
Dies funktioniert auch schon merh oder weniger.

Mein Problem ist nun jedoch folgendes.

Ich will eine Funktion Restart einbauen.

Ich bekomm jedoch immer wenn ich den Code:
this.backgroundWorker1.CancelAsync();
this.backgroundWorker1.RunWorkerAsync();

"Dieser BackgroundWorker ist derzeit ausgelastet und kann nicht mehrere
Aufgaben gleichzeitig ausführen."
Ich hab es auch schon mit:
System.Threading.Thread.Sleep(100);
zwischen den beiden Befehlen versucht.

Hat jemand eine Idee wie ich ihn neustarten kann?

Danke,
Andre
Thomas Scheidegger [MVP]
2006-11-18 15:54:11 UTC
Permalink
Hallo Andre
Post by Andre G.
this.backgroundWorker1.CancelAsync();
this.backgroundWorker1.RunWorkerAsync();
"Dieser BackgroundWorker ist derzeit ausgelastet
lies MSDN
http://msdn2.microsoft.com/de-de/library/system.componentmodel.backgroundworker.cancelasync.aspx

"Der Worker-Code sollte regelmäßig prüfen,
ob die CancellationPending-Eigenschaft auf true festgelegt wurde"

Solange dein Worker-Code fest zB in einer DB-Abfrage / Schleife o.ä. steckt,
(meist gar via ADO.NET intern in unmanaged Code, also 100% blockierend!)
wirst du nie eine Reaktion erhalten,
dies musst du schon selber korrekt in deinem Worker-Code designen & codieren.
(was die eigentliche Kunst des Multi-Threading ist)
--
Thomas Scheidegger - MVP .NET - 'NETMaster'
http://www.cetus-links.org/oo_dotnet.html - http://dnetmaster.net/
Frank Dzaebel
2006-11-18 16:08:22 UTC
Permalink
Hallo Andre,
Post by Andre G.
this.backgroundWorker1.CancelAsync();
this.backgroundWorker1.RunWorkerAsync();
"Dieser BackgroundWorker ist derzeit ausgelastet und kann nicht mehrere
Aufgaben gleichzeitig ausführen."
Du brauchst zunächst ein
bw.WorkerSupportsCancellation = true;
Dann im bw.DoWork ein Abfrage wie etwa:
if (bw.CancellationPending)
{ e.Cancel = true; return;}
Und als drittes entscheidendes:
Nicht direkt danach gleich neustarten,
sondern mindestens auf das Beenden warten,
also maximal etwa:

if (bw.WorkerSupportsCancellation)
{
bw.CancelAsync();
while (bw.IsBusy) Application.DoEvents();
bw.RunWorkerAsync();
}

Hier auch ein Beispiel:

[Threading in C#, Part 3]
http://www.albahari.com/threading/part3.html
(suche nach WorkerSupportsCancellation)


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Loading...