Annullare operazione asincrona
-
26-10-2019 - |
Domanda
sto sviluppando una libreria di classi che implementa uno stack di protocollo. Ci Ho un DoSomething un'operazione asincrona che implementa IAsyncResult. L'uso di questo metodo può utilizzare BeginDoSomething e EndDoSomething. Finché si tratta di un compito comune.
Ora ho l'obbligo di rendere l'operazione asincrona interrompibile. Posso pensare a diversi modi per raggiungere questo, ma non sono sicuro che uno è il migliore:
- Avere un metodo CancelDoSomething oltre BeginDoSomething e EndDoSomething. Questo non è il modello comune asaync e quindi non facile da scoprire per l'utente dell'operazione.
- Secondo a nessuno. 1: Avere una proprietà Annulla
- L'istanza di IAsyncResult restituito da BeginDoSomething può essere colato a DoSomethingAsyncResult. DoSomethingAsyncResult ha un metodo Annulla. Ancora una volta, questo non è l'uso comune del modello asincrono e difficilmente per sapere con "l'utente comune" della libreria di classi.
- Secondo a nessuno. 3: Avere una proprietà Annulla
- L'istanza di IAsyncResult restituito da BeginDoSomething attrezzi IAbortableAsyncResult:
public IAbortableAsyncResult:IAsyncResult { void Abort(); }
. Per me questo sembra essere il modo più elegante. Quando l'utente avvia l'operazione utilizzando BeginDoSomething ottiene un'istanza di IAbortableAsyncResult il che significa che questa funzione speciale è preminentemente presentò a lui.
Qual è la soluzione migliore? ci sono ancora più modi per risolvere questo? Io non preferisco. 5 perché non ha un odore di codice (almeno io non ho riconosciuto fino ad ora).
[EDIT]
Un approccio non basandosi su TPL / .NET 4 è apprezzato di avere una soluzione che è anche applicabile in codice legacy che non può essere portato su l'ultima versione di .NET framework.
[/ EDIT]
Soluzione
CancellationToken e CancellationTokenSource sono stati aggiunti alla .net a 4,0, e costituiscono la base per un modello di cancellazione comune, da allora. In generale, i metodi asincroni hanno un sovraccarico che prende una CancellationToken.
I consumatori di CancellationTokens possono registrarsi per un callback quando il token viene annullata, e utilizzare il callback per fermare l'esecuzione. In alternativa, se il compito non è particolarmente lunga esecuzione, la proprietà IsCanceled può semplicemente essere interrogato in modo intermittente.
Il CancellationToken è l'interfaccia utilizzata dal compito asincrono, l'iniziatore della attività utilizza un CancellationTokenSource emettere il token, e può quindi annullare in futuro.
Una delle cose belle di questo approccio, diverso da quello che diventando un metodo standard per la cancellazione approccio, è che è componibile. Se l'attività compone varie altre operazioni asincrone annullabili Analogamente cancellazione può essere fatto passare attraverso ad essi e cancellazione dovrebbero funzionare automaticamente da sé.