C # Wie kann ich eine Pause zu einer anderen Unterroutine senden?

8

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

    
chakrit 27.10.2008, 23:19
quelle

6 Antworten

13

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.

    
Mark S. Rasmussen 27.10.2008 23:21
quelle
13

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.

    
chakrit 27.10.2008 23:27
quelle
1

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!

    
Alex 28.10.2008 00:06
quelle
0

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. "

    
Rob Walker 27.10.2008 23:25
quelle
0

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.

    
wusher 27.10.2008 23:28
quelle
0

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:)

    
Dan F 28.10.2008 00:11
quelle

Tags und Links