2010-07-18 10 views
7

Ich habe eine Aufgabe im Hintergrundarbeiter ausgeführt. Beim Klicken auf den Start-Button startet der Benutzer den Prozess und hat einen Cancel-Button, um die Verarbeitung abzubrechen.C# -Hintergrundarbeiter

Wenn Benutzer auf Abbrechen klickt, möchte ich ein Meldungsfeld anzeigen, dass "Prozess wurde nicht abgeschlossen, möchten Sie fortfahren".

Hier möchte ich die Verarbeitung, die nur nach Benutzereingaben gemacht werden kann. Bis dann den hinteren Grundfaden anhalten wollen. Kann mir jemand dabei helfen? Gibt es irgendwie, den Hintergrundarbeiter für einige Zeit anzuhalten. Jede Art von Hilfe wird geschätzt.

Antwort

5

Nicht eingebaut. Sie könnten Ihren Code an (auf jeder [n] Schleife Iterationen, etc.) etwas wie eine ManualResetEvent überprüfen, um zu sehen, ob es weiterlaufen soll (zur gleichen Zeit, die es für die Stornierung prüft). Ich empfehle suspending den Thread (Thread.Suspend), da Sie nicht wissen, welche Sperren etc. es zu der Zeit halten kann.

Auf der anderen Seite ... warum lassen Sie es nicht laufen, bis Sie wissen es sollte abgebrochen werden? Dann müssen Sie nur für alle [n] Iterationen nach einer Stornierung suchen (es gibt eine Markierung dafür).

+0

Vielleicht ist die Verarbeitung CPU-intensiv und der Programmierer möchte dem Benutzer vorübergehend Ressourcen zurückgeben, während er seine Entscheidung trifft. –

+0

Oder der Hintergrundprozess macht etwas irreversible (Entfernen von Dateien, etc.), die * schnell * unterbrochen werden sollte, wenn sie versehentlich gestartet wird. – Heinzi

2

Wenn der BackgroundWorker an einem Objekt arbeitet, das für beide Threads sichtbar ist, können Sie dieses Objekt 'sperren' während Sie darauf warten, dass der Benutzer die Frage in einem Dialogfeld beantwortet. Dies führt dazu, dass der Thread des Arbeiters angehalten wird, bis der dialoggenerierende Thread die Sperre beendet.

+0

Das würde den Worker nur blockieren, wenn der Worker-Thread ständig versucht, die Sperre zu übernehmen und sie freigibt. Und es könnte dazu führen, dass die ** UI ** blockiert wird, wenn das bearbeitete * es nicht jedes Mal freigibt. –

+0

Richtig, es hängt davon ab, wie der Arbeiter das Objekt benutzt (wenn/wenn die Sperre akquiriert/freigegeben wird). Es kann jedoch ein neues "Dummy" -Freigabeobjekt verwendet werden, wenn kein existierendes Objekt gemäß den oben genannten Bedingungen behandelt wird (in Post und Kommentar). – Assaf

Verwandte Themen