Wie kann ich einen BackgroundWorker anhalten? Oder etwas ähnliches

8

Ich habe BackgroundWorker verwendet, um einige Websites herunterzuladen, indem ich in einer Schleife WebClient.DownloadString aufruft. Ich wollte die Option für den Benutzer, um in der Mitte der Download-Sache abzubrechen, also rief ich CancelAsync immer wenn ich fand, dass CancellationPending in der Mitte der Schleife war.

Aber jetzt bemerkte ich, dass die Funktion DownloadString kinda manchmal einfriert, also entschied ich mich, stattdessen DownloadStringAsync zu verwenden (all das innerhalb des anderen Threads, der mit BackgroundWorker erstellt wurde). Und da ich meinen ganzen Code nicht schreiben will, indem ich die Schleife und die Funktion nach dem Aufruf von DownloadStringAsync abbringe, habe ich direkt nach dem Aufruf eine while-Schleife erstellt, die nur nach einer Variable bool Stop sucht, die ich umdrehe true, wenn der Ereignishandler DownloadStringCompleted aufgerufen wird oder wenn der Benutzer die Operation abbrechen möchte.

Nun, das Seltsame ist, dass es in der Debug-Version gut funktioniert; aber auf der ersten Version friert das Programm in der while-Schleife ein, als ob es der Hauptthread wäre.

    
Juan 12.06.2010, 08:27
quelle

3 Antworten

4

Klingt für mich, dass Sie beschäftigt sind und mit einer While-Schleife warten. Sie sollten stattdessen Ereignissignalisierung verwenden, z. ein WaitHandle. Eine busy-waiting-Schleife im Freigabemodus kann sehr gut Ihre gesamte CPU verbrauchen und ein Gefühl des Einfrierens geben.

Signalisieren Sie das WaitHandle in DownloadStringCompleted oder wenn der Benutzer den Download abbricht.

Überprüfen Sie die MSDN-Dokumentation in der WaitHandle-Klasse. Da ist auch ein Beispiel.

    
Mikael Svenson 12.06.2010, 08:34
quelle
0

Senden Sie Ihre while-Schleife, die nach dem Abbruch sucht, für kurze Zeit (einige ms). Dadurch wird die CPU-Laufzeit für andere Threads und Prozesse frei.

    
Mark 12.06.2010 08:33
quelle
0

nettes Thema, ich habe es benutzt In meinem Hintergrund bearbeiten Sie einen Doppelvorgang während

%Vor%

Und ich habe eine Schaltfläche pause, dass, wenn ich es drücke, pausierenWorker (Globale Variable oder Eigenschaft) wahr wird und nur die erste Schleife wiederholt, ohne den icounter zu erhöhen, und wenn ich pauseworker = false mache, wird der Prozess fortgesetzt

    
themis 18.01.2012 08:49
quelle