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:

  1. 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.
  2. Secondo a nessuno. 1: Avere una proprietà Annulla
  3. 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.
  4. Secondo a nessuno. 3: Avere una proprietà Annulla
  5. 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]

È stato utile?

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é.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top