2015-06-05 11 views
6

Questa è più una domanda riguardante la comprensione di come e quando Nancy potrebbe annullare un gestore di richieste asincrone tramite l'istanza cancellationToken fornita.Dov'è il tasto CancelToken di Nancy per i richiedenti asincroni che vengono e quando vengono cancellati?

Fondamentalmente quello che mi sto chiedendo è in quali condizioni è il token. IsCancellationRequested impostato su true - questo è documentato o spiegato da qualche parte?

In che modo Nancy gestisce i gestori asincroni che "non ritornano mai" nel "tempo"? E riguardo 'in tempo': c'è un timeout/limite dopo il quale gli handler vengono cancellati?

risposta

0

Questa è la bellezza dei token di cancellazione, non è necessario conoscere o preoccuparsi di come vengono impostati. Questo dipende interamente dalla persona che ti fornisce il token. Devi solo guardare il token e vedere se è stato impostato o meno.

Se si chiama un metodo che accetta uno CancellationToken e si desidera sapere come crearne uno che è possibile impostare quando lo si desidera, è necessario utilizzare uno CancellationTokenSource per creare un token; è possibile utilizzare il CTS per annullare il token che genera o impostarlo per essere cancellato dopo un determinato periodo di tempo.

+0

va tutto bene - il codice stesso non si preoccupa di quando e come - annulla quando e come richiesto il più rapidamente possibile. Come ho detto, sono io che voglio capire come e quando Nancy lo fa. –

+0

@ JörgB. Tu * non puoi *. È * oscurato intenzionalmente da te * per conoscere il meccanismo specifico di come intende chiamare il chiamante per annullare il token di cancellazione. Come * potresti * potresti saperlo? Le uniche cose che puoi fare sono ciò che viene fornito nell'API del token, cioè determinare se è attualmente cancellato o registrare un gestore di eventi da attivare quando viene cancellato. Questo è tutto. Se vuoi qualcos'altro, devi creare il tuo meccanismo per questo. – Servy

+5

grazie ma ti manca la domanda che ho posto - Non sto parlando o mi sto interrogando sul concetto generale di CancellationTokens. Come ho detto, è ben compreso. Sono curioso di Nancy. E i suoi gestori asincroni. Questo sta girando in una direzione sbagliata e strana. Io (la persona, non il mio codice) sono interessato a Nancy e alla sua meccanica dei gestori asincroni. Se qualcuno lo sa e dice che è inoltrato 1: 1 da Asp.Net .. Sono felice. Se c'è di più, sono interessato a questo. –

1

Ogni CancellationToken viene da qualche parte e da qualche parte si trova la sua Origine di CancellazioneToken.

Quando si chiama CancellationTokenSource.Cancel, ogni token creato da esso viene contrassegnato.


Una curiosità: CancellationToken è una struttura, il che significa che ogni volta che si passa ad una funzione o assegnarla a una variabile si fa una nuova copia. Poiché la fonte non può tenere traccia di tutte queste copie, non possiamo avere un evento CancellationToken.IWasCancelled. Invece, quando chiami IsCancellationRequested, il token deve chiederne l'origine.

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


Quindi, tornando a Nancy, cercare il loro codice sorgente per CancellationTokenSource e troverete la risposta. Ecco l'unico che ho visto.

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

3

So che questa è una vecchia questione, ma ero nella tua stessa situazione e credo di aver trovato una risposta, almeno se si utilizza Owin per ospitare la vostra applicazione (utilizzando Nancy.Owin).

Il CancellationToken viene fornito direttamente da Owin tramite la proprietà IOwinRequest.CallCancelled (Nancy source code e used here). Questo token può essere impostato da Owin se la richiesta viene annullata (ad esempio chiudendo forzatamente la connessione HTTP).