La clase CancellationTokenSource
es desechable. Un vistazo rápido en Reflector demuestra el uso de KernelEvent
, un recurso (muy probable) no administrado. Dado que CancellationTokenSource
no tiene finalizador, si no lo desechamos, el GC no lo hará.¿Cuándo deshacerse de CancellationTokenSource?
Por otro lado, si mira los ejemplos enumerados en el artículo Cancellation in Managed Threads de MSDN, solo un fragmento de código descarta el token.
¿Cuál es la forma correcta de eliminarlo en el código?
- No se puede envolver código de iniciar su tarea paralela con
using
si no esperarlo. Y tiene sentido tener cancelación solo si no esperas. - Por supuesto, puede agregar
ContinueWith
en la tarea con una llamadaDispose
, pero ¿es así? - ¿Qué sucede con las consultas cancelables de PLINQ, que no se sincronizan hacia atrás sino que simplemente hacen algo al final? Digamos
.ForAll(x => Console.Write(x))
? - ¿Es reutilizable? ¿Se puede usar el mismo token para varias llamadas y luego disponerlo junto con el componente de host, digamos el control de UI?
Debido a que no tiene algo así como un método Reset
a la limpieza IsCancelRequested
y Token
campo yo supongo que es no reutilizable, por lo tanto cada vez que inicia una tarea (o una consulta PLINQ) se debe crear uno nuevo . ¿Es verdad? En caso afirmativo, mi pregunta es ¿cuál es la estrategia correcta y recomendada para tratar con Dispose
en esas muchas instancias de CancellationTokenSource
?
Esta es una omisión importante en la respuesta aceptada actualmente por Bryan Crosby: si crea un CTS _linked_, corre el riesgo de pérdidas de memoria.El escenario es muy similar a los controladores de eventos que nunca están sin registrar. –
Tuve una fuga debido a este mismo problema. Utilizando un generador de perfiles pude ver registros de devolución de llamada que contienen referencias a las instancias CTS vinculadas. Examinar el código para la implementación de Disposición de CTS [aquí] (http://referencesource.microsoft.com/#mscorlib/system/threading/CancellationTokenSource.cs,548) fue muy revelador y pone de relieve la comparación de @SørenBoisen con las filtraciones de registro de controlador de eventos. – BitMask777
Los comentarios anteriores reflejan el estado de la discusión cuando se aceptó la otra respuesta de @Bryan Crosby. –