2015-06-05 5 views
6

Dies ist eher eine Frage zum Verständnis, wie und wann Nancy einen asynchronen Request-Handler über die angegebene cancellationToken-Instanz abbrechen könnte.Wo befindet sich Nancys CancellationToken für asynchrone Request-Handler, die von und wann abgebrochen werden?

Grundsätzlich frage ich mich, unter welchen Bedingungen ist die .IsCancellationRequested des Tokens auf True gesetzt - wird das irgendwo dokumentiert oder erklärt?

Wie behandelt Nancy asynchrone Handler, die nie in der Zeit zurückkehren? Und bezüglich "in time": Gibt es ein Timeout/Limit, nach dem Handler abgesagt werden?

Antwort

0

Das ist die Schönheit der Stornierungstoken, Sie müssen nicht wissen oder interessieren, wie sie gesetzt werden. Das liegt ganz bei der Person, die Ihnen das Token zur Verfügung stellt. Sie sehen sich nur das Token an und sehen, ob es gesetzt wurde oder nicht.

Wenn Sie eine Methode aufrufen, die eine CancellationToken akzeptiert und Sie wissen möchten, wie Sie eine erstellen können, die Sie wann immer Sie möchten festlegen, sollten Sie eine CancellationTokenSource verwenden, um ein Token zu erstellen; Sie können den CTS verwenden, um das generierte Token abzubrechen, oder Sie können festlegen, dass das Token nach einer bestimmten Zeit abgebrochen wird.

+0

das ist alles in Ordnung - der Code selbst kümmert sich nicht um das wann und wie - es bricht, wenn und wie angefordert so schnell wie möglich. Wie gesagt, ich möchte verstehen, wie und wann Nancy das macht. –

+0

@JörgB. Du * kannst nicht *. Es ist * absichtlich von Ihnen verdeckt *, den spezifischen Mechanismus zu kennen, mit dem der Anrufer das Annullierungszeichen löschen möchte. Wie kannst du das vielleicht wissen? Die einzigen Dinge, die Sie tun können, sind, was in der API des Tokens bereitgestellt wird, nämlich um festzustellen, ob es gerade abgebrochen wird, oder um einen Ereignishandler zu registrieren, der beim Abbrechen ausgelöst wird. Das ist es. Wenn Sie etwas anderes möchten, müssen Sie einen eigenen Mechanismus dafür erstellen. – Servy

+5

danke, aber Sie vermissen die Frage, die ich gestellt habe - ich spreche nicht oder wundere mich über das allgemeine Konzept von CancellationTokens. Wie gesagt, das ist gut verstanden. Ich bin neugierig auf Nancy. Und seine asynchronen Handler. Dies ist eine falsche, ungerade Richtung. Ich (die Person, nicht mein Code) interessiere mich für Nancy und seine Async-Handler-Mechanik. Wenn jemand weiß und sagt, dass es 1: 1 von Asp.Net weitergeleitet wird .. bin ich glücklich. Wenn es mehr gibt, interessiert mich das. –

1

Jedes CancellationToken kommt von irgendwo, und das ist irgendwo seine CancellationTokenSource.

Wenn Sie CancellationTokenSource.Cancel aufrufen, wird jedes von ihm erstellte Token markiert.


Fun fact: CancellationToken ist eine Struktur, die jedes Mal, bedeutet, dass Sie es an eine Funktion oder weisen Sie auf eine Variable es eine neue Kopie macht. Da die Quelle nicht alle Kopien nachverfolgen kann, können wir kein CancellationToken.IWasCancelled-Ereignis haben. Wenn Sie IsCancellationRequested aufrufen, muss das Token seine Quelle stattdessen fragen.

ref: https://msdn.microsoft.com/en-us/library/system.threading.cancellationtokensource(v=vs.110).aspx


So nach Nancy zurück, suchen ihren Quellcode für CancellationTokenSource und Sie werden Ihre Antwort finden. Hier ist der einzige, den ich gesehen habe.

https://github.com/NancyFx/Nancy/blob/8a29b0495bfac4806536327c4d78de1ee59bd513/src/Nancy/NancyEngine.cs

3

Ich weiß, dass dies eine alte Frage, aber ich war in der gleichen Situation, und ich denke, dass ich eine Antwort zumindest gefunden, wenn Sie Owin verwenden, um Ihre Anwendung zu hosten (mit Nancy.Owin).

Die CancellationToken kommt direkt von Owin über die IOwinRequest.CallCancelled Eigenschaft (Nancy source code und used here). Dieses Token kann von Owin gesetzt werden, wenn die Anfrage abgebrochen wird (z. B. durch gewaltsames Schließen der HTTP-Verbindung).

Verwandte Themen