2016-05-05 5 views
0

Vereinfachen, ich habe WPF-Anwendung, die zwei Klassen hat: eine Hauptfensterklasse mit GUI und eine Worker-Klasse, die auf einer Datei arbeitet. Wenn der Benutzer im Hauptfenster auf eine Schaltfläche klickt, wird der Worker-Thread gestartet.Notify Thread zu stoppen - Ereignis in einem anderen Thread und Klasse zu erhöhen - C#

Ich möchte einen Knopf im Hauptfenster machen, der Arbeiter stoppt. Es wurde jedoch kein Thread gelöscht, sondern es wurde benachrichtigt, dass der Benutzer einen Thread abgebrochen hat und ihm erlaubt, den Writer zu schließen und die Datei zu speichern.

Ich habe lange auf stackoverflow gesucht, aber alle Fragen betreffen nicht mein Problem. Ich möchte darauf hinweisen, dass ich nicht durch eine Schleife usw. iteriere, daher kann ich keine Flagge verwenden. Ich möchte eine Veranstaltung aus meinem Hauptfenster zu einer Thread-Klasse auslösen. Wie kann ich das machen?

+0

Welchen Datentyp verwenden Sie als Worker-Thread? Ist es ein Hintergrundarbeiter, asynchrone Aufgabe, Thread? Die meisten haben ein Abbruch-Token, aber wenn Sie einen rohen Thread verwenden, empfehle ich, zu einem Hintergrund-Worker zu wechseln, andernfalls müssen Sie diese Art von Logik selbst implementieren. – xtreampb

Antwort

2

Erstellen Sie eine CancellationTokenSource in Ihrer Hauptfensterklasse. Senden Sie die CancellationToken an den Worker-Thread. Code den Arbeiter, um das Token zu beobachten. MSDN verweist auf die Löschungsmuster und überprüft sie dort.

Wenn Stornierung erforderlich ist, initiieren sie von UI-Thread von Aufruf CancellationTokenSource.Cancel()

Sie haben noch eine Schleife, können Sie beobachten, wenn Prozess durch das Warten auf WaitHanndle des Token aufgehoben: CancellationToken.WaitHandle.WaitOne()

WaitOne wird unbegrenzt warten, bis Abbrechen aufgerufen wird.

+0

Vielen Dank für Ihre Antwort. Aber wie kann ich meinen Thread benachrichtigen, dass ein anderer Thread 'Cancel()' Methode ohne Eincheck-Schleife verwendet hat? – Niko

+0

Meine Antwort aktualisiert, überprüfen. Sie können das WaitHandle verwenden. – loopedcode

+0

Beachten Sie, dass der Thread auch [IsCancellationRequested'] (https://msdn.microsoft.com/en-us/library/system.threading.cancellationtoken.iscancellationrequested (v = vs.110) .aspx) aufrufen kann, was im Allgemeinen der Fall ist heller (ein 'WaitHandle' muss nicht erzeugt werden). Wenn Sie "IsCancellationRequested" nicht regelmäßig überprüfen möchten, können Sie [Register] (https://msdn.microsoft.com/en-us/library/dd321635 (v = vs.110) .aspx) aufrufen ist auch leichter als ein 'WaitHandle'. – casperOne

Verwandte Themen