2015-02-11 18 views
5

Sto eseguendo alcune operazioni asincrone e vorrei utilizzare CancellationToken per interrompere l'esecuzione di un'attività asincrona se l'utente lo richiede ad esempio. Per fare ciò è una buona pratica avere un dizionario con il quale posso trovare la discussione corretta per fermare l'operazione corretta? Quello che sto attualmente guardando è il seguente:Cancellazione Esempio di codice token

public Dictionary<Thread, CancellationToken> CancellationTokenData; 

Così, se l'utente richiede la cancellazione su un'operazione dovrebbe comportarsi correttamente se non sbaglio?

Quali sono le migliori pratiche per farlo?

Ad esempio, dire che l'utente esegue alcune operazioni molto lunghe su un set {A} all'interno del database utilizzando un Thread {B}. Quindi annulla l'operazione e va e usa un'altra lunga operazione sul set {A} da un altro thread. Dovrei usare una variabile globale per l'attuale CancellationToken?

+0

Non posso dire di aver capito cosa stai chiedendo ma le cancellazioni sono piuttosto semplici e non c'è assolutamente alcun motivo per tenere traccia dei thread. Crei una proprietà di CancellazioneToken e passa il suo token a qualsiasi operazione lunga, vale a dire qualsiasi metodo che accetta un token di cancellazione. Il client chiama il 'source' per interrompere, la sorgente segnala il token, qualsiasi * operazione * che controlla questo termina con grazia. È l'operazione/metodo che termina, non il thread. Non esiste un token "corrente", puoi passare lo stesso token a più operazioni –

+0

@PanagiotisKanavos Ok, ma stai usando una variabile locale per farlo? Se sto usando uno locale mi sento troppo limitato per poterlo chiamare solo all'interno del metodo corrente, e se lo uso come variabile globale le cose possono diventare disordinate? Dovrei avere uno globale per ciascuno? Spero che siamo sulla stessa pista. – Hristo

+0

Ho capito bene che ci sono delle dipendenze tra i thread? Quindi, ovviamente, DEVE usare lo stesso token per loro - e l'uso di un dizionario non ha senso ... –

risposta

15

Di solito, si dispone di uno CancellationTokenSource per operazione che è cancellabile. Passi a CancellationTokenSource tutti coloro che potrebbero dover annullare l'operazione (cts.Cancel()) e il suo CancellationToken (cts.Token) a tutti coloro che devono essere a conoscenza della cancellazione.

A questo livello di astrazione, non si fermano i fili; interrompi le operazioni. I thread sono solo dettagli di implementazione.

Pertanto, non penso sia una buona idea mappare i token ai thread. Se le attività sono coinvolte, è una pessima idea, perché non c'è alcuna garanzia che ogni attività venga effettivamente eseguita su un nuovo thread.

+0

Okay, quindi come si esegue la mappatura del token di annullamento all'operazione? – Hristo

+0

Ad esempio, dire che voglio interrompere un'operazione A dall'esecuzione e ho il token di annullamento con altri 10 annullamentiToken da altre operazioni. Qual è l'approccio giusto per collegare l'operazione che si sta eseguendo al token di cancellazione? – Hristo

+0

@ Chris non lo fai, questo è il punto. Tu * lo passi * al metodo come parametro. I metodi lo controllano ad es. Dopo ogni passo del ciclo, o aggiungono un gestore di eventi all'evento Annulla per fare ciò che vogliono fare all'annullamento –