Ich versuche einen Windows-Dienst aufzubauen, der eine gewisse Parallelität für das Zusammenfassen von Dateien aus verschiedenen FTP-Quellen benötigt. Um mehrere FTP-Downloads zu starten, suche ich in der TPL-Bibliothek nach foreach-Loops und mache Parallelität ganz einfach. Aber wenn ich suche, wie ich meine Dienstleistung (en) starte oder stoppe, besteht die beste Möglichkeit darin, neue Threads in OnStart()
method zu erstellen, wie es hier beschrieben wird Ссылка
Beim Lesen von TPL wird immer darauf hingewiesen, dass TPL fortgeschrittener ist als manuelles Threading und manuelles Stoppen von Threading.
Ich habe keinen Beispiel-Beitrag gefunden, der beschreibt, wie man eine TPL-Schleife innerhalb von WindowsService erstellt?
Mein Code:
%Vor% Und innerhalb von WorkerThreadFunc
, um eine Art TPL
Oder ich sollte meine WorkerThreadFunc auch als TASK starten?
Vorbehalt hier ist nicht nur, wie Sie start Ihren Worker starten, sondern auch, wie Sie ihn stoppen .
Neben der Aufgabe selbst bietet TPL Ihnen auch eine sehr bequeme Möglichkeit, Aufgaben abzubrechen , indem Sie die Objekte CancellationToken
und CancellationTokenSource
verwenden.
Um diese Technik auf Ihren Windows-Dienst anzuwenden, müssen Sie im Wesentlichen Folgendes tun:
%Vor%Anmerkungen:
TaskCreationOptions.LongRunning
weist einen Taskplaner darauf hin, dass für diese Aufgabe möglicherweise ein separater Thread erforderlich ist und dass er nicht in einen ThreadPool eingefügt wird (damit andere Elemente in einem Pool nicht blockiert werden) CancellationToken
wird an WorkerThreadFunc übergeben, weil dies die Art und Weise ist, wie es benachrichtigt wird, um seine Arbeit zu stoppen - siehe Abschnitt "Stornierung" unten. Und in Ihrer OnStop-Methode lösen Sie die Löschung aus und warten auf den Abschluss der Aufgabe:
%Vor% Indem wir tokenSource.Cancel();
aufrufen, teilen wir einfach jedem von diesem CancellationToken
ausgegebenen tokenSource
eine Annullierung mit und jede Methode, die ein solches Token akzeptiert (wie Ihre WorkerThreadFunc) sollte nun sein beenden.
Die Handhabung der Stornierung ist spezifisch für die Implementierung, aber die allgemeine Regel besagt, dass Ihre Methode den Zustand des Stornierungs-Tokens überwachen und in der Lage sein sollte, die Arbeit in angemessener Zeit zu stoppen . Dieser Ansatz erfordert, dass Sie Ihre Arbeit logisch in kleinere Teile aufteilen, so dass Sie nicht an einer Arbeit festhalten, die viel Zeit in Anspruch nimmt, und keine neue Arbeit beginnt, wenn eine Stornierung angefordert wurde .
Wenn Sie Ihren WorkerThreadFunc-Code betrachten, sollten Sie prüfen, ob abgebrochen werden kann, bevor Sie jede neue Aufgabe ProcessPicture
ausführen, zum Beispiel:
Wenn ProcessPicture
sehr lange dauert, können Sie auch die Löschungsunterstützung hinzufügen. Ähnlich wie bei WorkerThreadFunc sollten Sie ProcessPicture
implementation berücksichtigen. Die Schlüsselidee hier ist, einen Ort zu finden, an dem Sie sicher aufhören können, Arbeit zu erledigen und von der Methode zurückzukommen. Mit sicher meine ich - ohne System oder Daten in einem defekten Zustand zu verlassen.
Zusätzlich zur Überwachung von IsCancellationRequested
in WorkerThreadFunc können Sie auch Register
ein Rückruf, der ausgeführt wird, wenn die Stornierung angefordert wird, um andere Dinge wie Aufräumen, etc. zu tun:
Und
%Vor%Tags und Links c# windows-services multithreading task-parallel-library