Est-il possible d’annuler une tâche C # sans AnnulationToken?

Je dois annuler un appel d’API qui renvoie une tâche, mais cela ne prend pas AnnulationToken en tant que paramètre et je ne peux pas en append.

Comment puis-je annuler cette tâche?

Dans ce cas particulier, j’utilise Xamarin.Forms avec l’object Geocoder.

IEnumerable positions = await geo.GetPositionsForAddressAsync(address); 

Cet appel peut parfois prendre beaucoup de temps. Pour certains de mes cas d’utilisation, l’utilisateur peut simplement naviguer vers un autre écran et le résultat de cette tâche n’est plus nécessaire.

Je crains également que mon application ne soit mise en veille et que cette tâche de longue durée ne soit pas arrêtée, ou que la tâche soit terminée et nécessite un code qui n’est plus valide.

Le meilleur que j’ai lu à ce sujet est celui de Stephen Toub sur le blog “Parallel Programming with .NET” .

Fondamentalement, vous créez votre propre “surcharge” d’annulation:

 public static async Task WithCancellation( this Task task, CancellationToken cancellationToken) { var tcs = new TaskCompletionSource(); using(cancellationToken.Register( s => ((TaskCompletionSource)s).TrySetResult(true), tcs)) if (task != await Task.WhenAny(task, tcs.Task)) throw new OperationCanceledException(cancellationToken); return await task; } 

Et utilisez ensuite cela avec un try / catch pour appeler votre fonction asynchrone:

 try { await op.WithCancellation(token); } catch(OperationCanceledException) { op.ContinueWith(t => /* handle eventual completion */); … // whatever you want to do in the case of cancellation } 

Vraiment besoin de lire son billet de blog …

En bref … Non, il n’est pas possible d’annuler une tâche n ° qui n’essaie pas d’observer un CancellationToken, du moins pas dans le contexte auquel vous faites référence. (mettre fin à l’application par exemple, le ferait)

Le lien ici sur Annulation traite des différents modèles permettant de tirer parti d’un jeton d’annulation, mais comme vous traitez avec une bibliothèque que vous ne contrôlez pas, vous ne pouvez rien faire de plus.