Grundlegendes Entwurfsmuster für die Verwendung von TPL im Windows-Dienst für C #

8

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

zu machen %Vor%

Oder ich sollte meine WorkerThreadFunc auch als TASK starten?

    
adopilot 09.12.2014, 16:33
quelle

1 Antwort

19

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.

Starten und Beenden des Windows-Dienstes mit TPL

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%

Stornierung

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:

%Vor%

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:

%Vor%

Und

%Vor%     
t3z 09.12.2014, 17:12
quelle