Ich habe eine Schleife ausgeführt, die 1000 Datensätze verarbeiten wird. Wenn die Schleife einmal ausgeführt wird, kann sie nicht gestoppt werden und der Benutzer muss warten, bis er beendet ist. Wie kann ich die Schleife anhalten, wenn jemand auf die Schaltfläche "Abbrechen" klickt? Wie kann ich in diese andere Routine einbrechen?
Danke
Sie können es in einem eigenen Thread ausführen und den Thread abbrechen. Achten Sie jedoch darauf, dass dadurch die Operation in einem schlechten Zustand bleibt.
Stattdessen sollten Sie ein Exit-Flag erstellen, das der Thread bei Safepoints überprüft. Wenn es zum Beenden markiert ist, stoppt der Thread, sobald es dafür sicher ist.
Sie können einfach die Komponente BackgroundWorker verwenden.
Es ist ereignisbasiert und sehr einfach zu verwenden. Sieht sehr passend für das aus, was du beschreibst.
Es hat auch eine gute Unterstützung für Cancellation-Signalisierung sowie Fortschritts-Reporting .
Und viele Codebeispiele können Sie bei Google nachschlagen.
Legen Sie die Eigenschaft WorkerSupportsCancellation so fest, dass sie zutrifft.
p> %Vor%Mach es , bevor du den Arbeiter startest.
Dann können Sie in der Schleife das CancellationPending abrufen Eigenschaft:
%Vor%Nur ein Beispiel, aber Sie sollten die Idee bekommen.
Danke für die Antworten. Es ist ein backgroundworker
, aber wenn ich backgroundworker1.cancelAsync();
verwende, bekomme ich die Ausnahme:
"Dieser BackgroundWorker gibt an, dass er keine Stornierung unterstützt. Ändern Sie WorkerSupportsCancellation, um anzugeben, dass es unterstützt Stornierung "
Wie kann ich das ändern? Dies ist der vererbte Code, sorry!
Wie Mark sagte, müssen Sie eine Art kooperative Synchronisation implementieren. Leute neigen oft dazu, Thread.Abort hier zu benutzen ... aber das ist eine schlechte Idee.
Es gibt eine Reihe von Fragen, die sich mit diesem Thema befassen, zum Beispiel: " Gibt es eine gute Methode in C #, um eine Ausnahme für einen bestimmten Thread zu erzeugen. "
Sie können eine Abbrechen-Schaltfläche hinzufügen, die ein boolesches Flag setzt
Fügen Sie innerhalb der Schleife "Application.DoEvents" an Schlüsselpunkten hinzu und überprüfen Sie dann das boolesche Flag. Wenn das Flag ausgelöst wurde, machen Sie Ihre Bereinigung vor und beenden Sie die Schleife.
Setzen Sie die Eigenschaft WorkerSupportsCancellation
auf Ihrem BackgroundWorker
auf true: -)
Sie müssen auch die Eigenschaft CancellationPending
in Ihrer Schleife überprüfen, um zu sehen, ob Sie die Verarbeitung abbrechen sollten. Der MSDN-Artikel, der chakrit verlinkt hat, hat einen schönen Block mit Beispielcode
Edit: D'oh, du hast mich durch ein paar Sekunden Chakrit bekommen:)
Tags und Links c# multithreading