El curso de acción adecuado sería que los creadores de algunos objetos desechables se opongan ligeramente a la "regla" de Microsoft de realizar cualquier acción sobre un objeto dispuesto y lanzar una excepción, y en su lugar seguir la regla general de que una excepción se lanzará cada vez que no se puedan cumplir las condiciones posteriores de un método. Si el propósito del método Cancelar es garantizar que nadie continúe considerando que un trabajo es en vivo, e incluso antes de que se llame al método Cancelar, todos consideran que el trabajo está muerto, entonces se cumple la condición posterior del método, independientemente de si el objeto está dispuesto.
En general, el código fuera de un objeto bien diseñado no debería necesitar consultar si ha sido eliminado, excepto posiblemente para afirmar que lo ha sido. En cambio, el objeto en sí debería proporcionar métodos cuyo significado en un objeto dispuesto sería claro y no ambiguo. Esos métodos podrían usar internamente una bandera IsDisposed, pero tendrían que usar cualquier bloqueo que fuera necesario para evitar condiciones de carrera. En general, el patrón
if (!myThing.isDisposed)
myThing.DoSomething();
es una indicación de que MYTHing realmente debería apoyar un método DoSomethingIfNotDisposed (posiblemente llamado TryDoSomething). Si no puede hacer eso, mi inclinación podría ser escribir su propio método de extensión DoSomethingIfNotDisposed y usar Try/Catch para sofocar una excepción ObjectDisposedException (o cualquier excepción particular que arroje el objeto).
¿Por qué es la limpieza de un hilo recursos todavía en uso?Eso me parece un gran defecto de diseño. –
El 'CancellationToken' se utiliza para la sincronización. Sucede cuando dos hilos intentan cancelar el trabajo al mismo tiempo. Tal vez una cerradura ayuda? – Xaqron
Por favor, corrija su pregunta por cierto, no se está deshaciendo de 'CancellationToken', eso no se puede hacer. Estás rechazando el 'CancellationTokenSource'. –