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.
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.
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
Tags und Links c# backgroundworker cancellation request-cancelling