2009-11-11 16 views
10

Noté que System.Threading.Thread implementa un finalizador pero no IDisposable. La práctica recomendada es implementar siempre IDisposable cuando se implementa un finalizador. Jeffrey Richter wrote que la pauta es "muy importante y siempre se debe seguir sin excepción".¿Por qué no Thread implement IDisposable?

Entonces, ¿por qué no se rosca implementar IDisposable? Parece que implementar IDisposable sería un cambio sin interrupciones que permitiría la limpieza determinista de los recursos finalizables de Thread.

Y una pregunta relacionada: dado que el hilo es finalizable, ¿tengo que mantener referencias a ejecutar Threads para evitar que se finalicen durante la ejecución?

Respuesta

8

¿Qué haría la eliminación de un objeto Thread? El "recurso" en este caso tiene su propia limpieza natural: el acabado del hilo. Tenga en cuenta que también falta el sentido de propiedad ... dentro del hilo de ejecución, siempre puede usar Thread.CurrentThread, por lo que solo ese hilo podría realmente reclamar cualquier tipo de propiedad.

Básicamente creo Thread es un caso poco inusual - hay una vida para el recurso subyacente, pero no es algo que debe ser limpiado de forma explícita.

+0

Dado que ManagedThreadID es un número entero, y puede leerse incluso antes de iniciar un hilo, eso sugeriría que algo se asigna cuando se crea un hilo (incluso si solo el número mismo). Si bien sería extraño que una aplicación creara más de 2 mil millones de objetos Threads, parecería que los identificadores serían un recurso que podría ser digno de ser lanzado. – supercat

+0

@supercat: punto interesante. 'ManagedThreadId' parece ser asignado de forma secuencial. No sé qué sucedería después de haber creado más de 2 mil millones de ellos. –

+0

Parece que los identificadores se vuelven a utilizar cuando los objetos Thread son elegibles para la finalización, por lo que sospecho que Threading.Thread está implementando Finalize pero no IDIsposable. – supercat

3

Eso es probablemente porque no se puede disponer de de un hilo. En su lugar, puede pedirle que muera usando Abort() o similar.

+0

Puede, pero en general, el uso de Abortar no se considera una buena práctica: simplemente asegúrese de que el método de hilo retorna (usando un bool o similar) y el sistema borra el resto. –

1

Esto es una especie de pregunta de diseño, por lo que cualquiera que no haya participado en la construcción de este aspecto de .NET solo puede especular. Dicho esto, this blog post hace un buen punto:

... implementar IDisposable no haría ninguna diferencia, al menos en la implementación actual del hilo. He aumentado el número de hilos que se crea y el número de identificador se cae en algún momento por lo que hay algún mecanismo para cerrarlos

Hilos no limpian de forma natural después de sí mismos, por lo que no son un recurso que debe ser gestionado en el sentido típico.

Cuestiones relacionadas