Frage

Ich möchte ein Timeout auf die Durchführung von Aufgaben in einem Projekt implementieren, die die CCR verwendet. Im Grunde genommen, wenn ich poste ein Element in einem Hafen oder enqueue einer Aufgabe zu einem DispatcherQueue ich in der Lage sein wollen, die Aufgabe oder den Thread abzubrechen, dass seine läuft auf, wenn es länger dauert, als einige Zeit konfiguriert. Wie kann ich das tun?

War es hilfreich?

Lösung

Können Sie bestätigen, was Sie fordern? Sind Sie mit einer langlebigen Aufgabe in dem Dispatcher? den Thread zu töten würde das CCR-Modell brechen, so müssen Sie auf den Thread signalisieren zu können, seine Arbeit und Ertrag zu beenden. Unter der Annahme, es ist eine Schleife, der nicht schnell genug, um Finishing, Sie können wählen, einen Timer einzureihen:

var resultTimeoutPort = new Port<DateTime>();
dispatcherQueue.EnqueueTimer(TimeSpan.FromSeconds(RESULT_TIMEOUT), 
                             resultTimeoutPort);

und sicherzustellen, dass das Sperrgewinde zur Verfügung einen Verweis auf resultTimeoutPort hat. In der Sperrschleife, könnte einer der Austrittsbedingung sein:

do
{
    //foomungus amount of work
}while(resultTimeoutPort.Test()==null&&
       someOtherCondition)

Bitte weitere Informationen veröffentlichen, wenn ich den Holzweg bin.

Andere Tipps

Sie können den Faden (Thread.currentThread) zu Beginn des CCR „Receive“ Handler (oder in einem Verfahren, das Ihre Methode über einen Delegaten ruft) registrieren. Dann können Sie Ihre periodische Überprüfung tun und abbrechen, wenn notwendig, im Grunde das gleiche wie Sie es getan hätte, wenn Sie den Faden manuell erstellt. Der Haken ist, dass, wenn Sie Ihren eigenen Microsoft.Ccr.Core.Dispatcher mit einer festen Anzahl von Threads verwenden, ich glaube nicht, dass es eine Möglichkeit, diese Fäden wieder zu bekommen ist, wenn Sie sie abbrechen (basierend auf meinen Tests). Also, wenn Ihr Disponent 5 Fäden hat, werden Sie nur in der Lage sein, 5-mal um den Vorgang abzubrechen, bevor Posting nicht mehr funktioniert, unabhängig davon, welche Aufgaben registriert wurden. Wenn Sie jedoch einen DispatcherQueue mit dem CLR-Thread-Pool bauen, werden alle CCR-Threads Sie abbrechen wird automatisch ersetzt, und Sie werden nicht das Problem haben. Von dem, was ich gesehen habe, obwohl der CCR Dispatcher empfohlen wird, denke ich, den CLR-Thread-Pool mit der Art und Weise in dieser Situation zu gehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top