¿Es posible cancelar una tarea de C # sin una cancelación cancelada?

Necesito cancelar una llamada a la API que devuelve una Tarea, pero no toma un CancelToken como parámetro, y no puedo agregar una.

¿Cómo puedo cancelar esa tarea?

En este caso particular, estoy usando Xamarin.Forms con el objeto Geocoder.

IEnumerable positions = await geo.GetPositionsForAddressAsync(address); 

Esa llamada a veces puede llevar mucho tiempo. Para algunos de mis casos de uso, el usuario simplemente puede navegar a otra pantalla y el resultado de esa tarea ya no es necesario.

También me preocupa que mi aplicación se duerma y que no se detenga esta tarea de ejecución prolongada, o que la tarea se complete y necesite un código que ya no es válido.

Lo mejor que he leído sobre esto es de Stephen Toub en el blog “Progtwigción Paralela con .NET” .

Básicamente creas tu propia ‘sobrecarga’ de cancelación:

 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; } 

Y luego use eso con un try / catch para llamar a su función asíncrona:

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

Realmente necesito leer su blog de publicación …

En resumen … No, no es posible cancelar una tarea ac # que no intenta observar un CancelToken cancelado, al menos no en el contexto al que se refiere. (terminando la aplicación por ejemplo, lo haría)

El enlace aquí en Cancelación describe los distintos patrones de cómo aprovechar un token de cancelación, pero como está tratando con una biblioteca que no controla, no hay mucho que pueda hacer.