Uso un token di cancellazione che viene passato in giro in modo che il mio servizio possa essere chiuso in modo pulito. Il servizio ha una logica che continua a provare a connettersi ad altri servizi, quindi il token è un buon modo per uscire da questi tentativi di loop in esecuzione in thread separati. Il mio problema è che ho bisogno di effettuare una chiamata a un servizio che ha una logica interna per i tentativi, ma di tornare dopo un periodo prestabilito se un tentativo fallisce. Vorrei creare un nuovo token di cancellazione con un timeout che farà questo per me. Il problema con questo è che il mio nuovo token non è collegato al token "master", quindi quando il token master viene cancellato, il mio nuovo token sarà ancora vivo fino a quando non viene eseguito il timeout o la connessione viene restituita. Quello che mi piacerebbe fare è collegare i due token insieme in modo che quando si cancella quello principale il mio nuovo annullerà anche. Ho provato a utilizzare il metodo CancellationTokenSource.CreateLinkedTokenSource
ma quando il mio nuovo token è scaduto, ha anche annullato il token master. C'è un modo per fare quello che devo fare con gettoni o intende richiedere modifiche alla logica di tentativi (probabilmente non sarà in grado di farlo facilmente)Collegamento dei token di cancellazione
Ecco cosa voglio fare:
Master Token - ha distribuito varie funzioni in modo che il servizio possa essere chiuso in modo pulito. Token temporaneo - passato a una singola funzione e impostato su timeout dopo un minuto
Se il token master viene cancellato, anche il token temporaneo deve essere annullato.
Quando il token temporaneo scade, NON deve annullare il token master.
Sei corretto. Ho iniziato a utilizzare CancellationTokenSource.CreateLinkedTokenSource ma ho pensato che non funzionasse. Ho dimenticato che quando il token va in time genera un'eccezione. Questo è stato preso più in alto nel mio codice. Questo ha dato l'impressione che non funzionasse come mi aspettavo. Inserendo la mia chiamata in un blocco catch try ha funzionato bene. – Retrocoder
@Retrocoder Se si desidera solo intrappolare il token interno, si consiglia di utilizzare un modello come 'try {doSomething (ct: childCts.Token); } catch (OperationCancelledException) quando (childCts.IsCancellationRequested) {} '. È possibile inserirlo all'interno di un ciclo di tentativi e creare la sorgente di codice figlio all'interno del ciclo. Quindi, quando il gettone genitore viene cancellato, salirà a bolla, ma quando il segnalino figlio annulla, fa semplicemente un tentativo. Non posso dire dal tuo commento, potresti già farlo correttamente ;-). – binki