2010-06-12 13 views
8

Ich benutzte eine BackgroundWorker, um einige Web site herunterzuladen, indem ich innerhalb einer Schleife WebClient.DownloadString rufte. Ich wollte die Option für den Benutzer, um in der Mitte der Download-Sachen zu stornieren, so rief ich CancelAsync immer wenn ich fand, dass CancellationPending war in der Mitte der Schleife.Wie kann ich einen BackgroundWorker anhalten? Oder etwas Ähnliches

Aber jetzt habe ich festgestellt, dass die Funktion DownloadString manchmal einfriert, so entschied ich mich stattdessen DownloadStringAsync zu verwenden (all dies in dem anderen Thread mit BackgroundWorker erstellt). Und da ich meinen ganzen Code nicht schreiben will, indem ich die Schleife und die Funktion nach dem Aufruf von DownloadStringAsync verlassen muss, habe ich direkt nach dem Aufruf eine While-Schleife gemacht, die nur nach einer Variablen bool Stop sucht, die ich entweder wahr mache, wenn DownloadStringCompleted Event-Handler wird aufgerufen oder wenn der Benutzer die Operation abbrechen möchte.

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

Antwort

4

Hört sich an, Sie sind beschäftigt - warten mit einer While-Schleife. Sie sollten stattdessen Ereignissignalisierung verwenden, z. ein WaitHandle. Eine "busy-wait" -Schleife im Freigabemodus könnte 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 docs in der WaitHandle-Klasse. Da gibt es auch ein Beispiel.

+0

WaitHandle funktioniert einfach perfekt. Vielen Dank! – Juan

+0

Pause/Fortsetzen Schleife im Hintergrund Arbeiter http://StackOverflow.com/Questions/8359058/Pause-resume-loop-in-background-Worker –

0

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

+1

Besetztes Warten ist eine schlechte Übung. –

+0

Ich weiß und wusste nicht, dass es sowas wie ein WaitHandle in C#/.Net (immer neue Dinge zu lernen :-)) gibt, aber manchmal ist Polling die einzige Lösung und dann sollte man darauf achten, dass nur der Prozess abfragt prüft einmal und gibt dann die CPU-Zeit (in Linux ist es die yield() - Funktion) auf, die dem Thread/Prozess vom Betriebssystem gegeben wird. – Mark

+0

Die WaitHandles können auch mit einer Zeitüberschreitung benutzt werden, so dass das Polling verhindert wird :) (Und ich habe meinen Anteil an beschäftigtem Warten verwendet, bis ich weiser geworden bin .. hehe) –

0

schönes Thema, habe ich In meinem Hintergrund Arbeitsprozess eine doppelte während

int icounter = 1; 
while (icounter < SomeListInventory.Count) 
      { 
       while (pauseWorker == false) 
       { 
        //----------------------- 
        //DO SOME WORK 
         icounter++; 
        //----------------------- 
       } 
      } 

Und ich eine Taste Pause haben, dass, wenn ich es drücken, pauseWorker (Global Variable oder Eigenschaft) wahr wird und Schleifen in die erste nur, ohne den icounter zu erhöhen, und wenn ich den pauseworker = false mache, geht der prozess weiter

Verwandte Themen