6

¿Por qué es legal lo siguiente?¿Es seguro registrarse con CancellationToken.None?

CancellationToken.None.Register(delegate { }); 

¿Por qué, por ejemplo, Register no lanzar una excepción en esta lista? ¿Es porque lo anterior equivale a NOP?

Antecedentes: La razón de esta pregunta es conocer si un método de aceptar una CancellationToken necesidades que ha de codificarse defensiva contra CancellationToken.None cuando se trata de registro.

Respuesta

10

CancellationToken.None no es una referencia nula, sino más bien un token de cancelación vacío. Como tal, tiene una instancia. El registro nunca se activará, ya que la fuente nunca se registrará como cancelada, pero pasará por "correctamente".

Aun así, pondré un código de verificación y defensa a este respecto, a menos que tenga cuidado con la eliminación correcta del CancellationTokenRegistration.


Editar:

Tras realizar investigaciones adicionales, si se registra contra CancellationToken.None, tendrá efectivamente a hacer nada, y el CancellationTokenRegistration devuelto no se requieren disposición. Esto no guardará una referencia a su objeto o delegado, y no formará una fuga, por lo que no es operativo por motivos prácticos. Esto debe ser seguro de hacer, y no debe exigir prácticas defensivas para evitar en su extremo.

+0

Me doy cuenta de que CancellationToken es un tipo de valor y, por lo tanto, siempre tiene un valor con CancellationToken.None que es equivalente a uno que está predefinido. ¿Crees, sin embargo, que el registro es un NOP solo para los tokens vacíos y por lo tanto no requiere defensa? –

+0

@Atif: Acabo de revisar y comprobar qué sucede en realidad: es seguro y no requiere defensa. (Edité mi respuesta para mostrar) Hay un cheque en el método Register que simplemente devuelve un nuevo registro, y ignora por completo al delegado si el token no se puede cancelar, que es el caso con CT.None. –

+0

Interesante. No encontré ese cheque que mencionas :), por lo tanto, mi pregunta. –