Comienzo una tarea, eso inicia otras tareas y así sucesivamente. Dado ese árbol, si alguna tarea falla, el resultado de toda la operación es inútil. Estoy considerando usar tokens de cancelación. Para mi sorpresa, el token no tiene un método "CancelThisToken()"...
¿Cómo puedo cancelarlo si solo tengo un CancellationToken ?
Como indica la documentación, debe llamar al método de cancelación desde el objeto de origen. El código de ejemplo se incluye en el enlace que proporcionó. Aquí están las secciones relevantes:
// Define the cancellation token. CancellationTokenSource source = new CancellationTokenSource(); previouslyProvidedToken = source.Token; ... source.Cancel();Estructura de token de cancelación
¿Cómo puedo cancelarlo si solo tengo un CancellationToken?
Editar: Escribí esto hace años y al revisarlo, no sé si es realmente válido cuando se escribió o ahora. Dejándolo aquí como está para la posteridad.
Sin una referencia a la fuente, no puede cancelar un token. Eso no significa que necesite el CancellationTokenSource que primero generó el token. Cuando se le otorga un CancellationToken , puede crear una nueva instancia de la fuente del token, asignar su token al token proporcionado y cancelarlo. Todas las demás partes que puedan leer este token verán que se ha solicitado su cancelación.
Como una extensión de las respuestas proporcionadas hasta ahora, si desea tener una instancia de CancellationToken proporcionada a sus métodos y cancelar internamente, debe examinar CancellationTokenSource.CreateLinkedTokenSource . En esencia, esto se cancelará cuando se llame a cts.Cancel() o cuando se llame a uno de sus tokens proporcionados.
Un token le da derecho a saber que alguien está tratando de cancelar algo. No le da derecho a señalar realmente una cancelación. Solo la fuente del token de cancelación te da eso. Esto es por diseño.