Jan Baer
2008-02-18 19:03:36 UTC
Hallo alle zusammen,
ich habe eine WPF Anwendung, bei der ich im Hintergrund über den
Backgroundworker Daten laden, während der Benutzer im Vordergrund an der
Oberfläche schon irgendwelche Eingaben vornehmen kann. Es kann also sein,
das der Benutzer durch eine bestimmte Aktion andere Daten laden will, als
die, die der Backgroundworker gerade lädt.
In der Methode, die das Laden über den Backgroundworker initiert, prüfe ich
mit backgroundWorker.IsBusy, ob der Backgroundworker gerade beschäftigt ist.
Wenn ich dort True zurück bekomme, dann breche ich mit
backgroundWorker.CancelAsync den Ladevorgang ab.
if(backgroundWorker.IsBusy)
{
backgroundWorker.CancelAsync();
while(backgroundWorker.IsBusy)
{
Thread.Sleep(100);
}
}
backgroundWorker.RunWorkerAsync();
Im DoWork-Ereignis frage ich CancellationPending ab und setze dann
eventArgs.Cancel = true.
Im RunWorkerCompleted Ereignis sollte dann eigentlich Cancelled = true sein.
Soweit die Theorie, in der Praxis bleibt der Code in der while-Schleife
hängen. Selbst wenn ich nur einmal den aktuellen Thread (über habe es bis
1000ms versucht) schlafen schicke, damit der Hintergrundthread Zeit bekommt,
abzubrechen, funktioniert das ganze nicht. Obwohl im DoWork-Ereignis
eventArgs.Cancel auf true gesetzt wird, ist im Eventhandler von
RunWorkerCompleted die Eigenschaft Cancelled = false. Nach Thread.Sleep ist
der backgroundWorker auch immer noch IsBusy = true.
Weiß jemand, wo hier der Fehler vergraben ist? Wenn ich Thread.Sleep
aufrufe, dann schicke ich doch den aktullen Thread, also in dem Falle den
Vordergrundthread schlafen. Der Hintergrundhtread sollte doch dadurch
eigentlich die Zeit bekommen, um ordnungsgemäß abzubrechen oder?
Vielen Dank für Eure Hilfe im voraus!
Beste Grüße
Jan
ich habe eine WPF Anwendung, bei der ich im Hintergrund über den
Backgroundworker Daten laden, während der Benutzer im Vordergrund an der
Oberfläche schon irgendwelche Eingaben vornehmen kann. Es kann also sein,
das der Benutzer durch eine bestimmte Aktion andere Daten laden will, als
die, die der Backgroundworker gerade lädt.
In der Methode, die das Laden über den Backgroundworker initiert, prüfe ich
mit backgroundWorker.IsBusy, ob der Backgroundworker gerade beschäftigt ist.
Wenn ich dort True zurück bekomme, dann breche ich mit
backgroundWorker.CancelAsync den Ladevorgang ab.
if(backgroundWorker.IsBusy)
{
backgroundWorker.CancelAsync();
while(backgroundWorker.IsBusy)
{
Thread.Sleep(100);
}
}
backgroundWorker.RunWorkerAsync();
Im DoWork-Ereignis frage ich CancellationPending ab und setze dann
eventArgs.Cancel = true.
Im RunWorkerCompleted Ereignis sollte dann eigentlich Cancelled = true sein.
Soweit die Theorie, in der Praxis bleibt der Code in der while-Schleife
hängen. Selbst wenn ich nur einmal den aktuellen Thread (über habe es bis
1000ms versucht) schlafen schicke, damit der Hintergrundthread Zeit bekommt,
abzubrechen, funktioniert das ganze nicht. Obwohl im DoWork-Ereignis
eventArgs.Cancel auf true gesetzt wird, ist im Eventhandler von
RunWorkerCompleted die Eigenschaft Cancelled = false. Nach Thread.Sleep ist
der backgroundWorker auch immer noch IsBusy = true.
Weiß jemand, wo hier der Fehler vergraben ist? Wenn ich Thread.Sleep
aufrufe, dann schicke ich doch den aktullen Thread, also in dem Falle den
Vordergrundthread schlafen. Der Hintergrundhtread sollte doch dadurch
eigentlich die Zeit bekommen, um ordnungsgemäß abzubrechen oder?
Vielen Dank für Eure Hilfe im voraus!
Beste Grüße
Jan