¡Buenos días! Supongamos que tenemos la siguiente clase:Implementación IDisposable para la clase que contiene hilos
class MultithreadOperation : IDisposable
{
private IList<Thread> operationThreads;
public void StartOperation()
{
// Initialize and start threads and put them to operationThreads
}
public void StopOperation()
{
// Aborts each thread.
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
disposed = true;
if (disposing)
{
// Release managed resources.
#1:
StopOperation();
}
// Release unmanaged resources.
#2:
StopOperation();
}
}
~MultithreadOperation()
{
Dispose(false);
}
}
En realidad, tengo que dejar todos los hilos, si se dispone de la instancia. Además, debo detener todos los hilos si la instancia es basura (de lo contrario, los hilos seguirán vivos, lo cual es malo para mí). Definitivamente, es totalmente legal invocar el método StopOperation() en el lugar # 1.
Quiero saber si hay algún inconveniente si invocamos StopOperation() en el lugar # 2? Según tengo entendido, la lista de subprocesos ya puede ser basura cuando se ejecuta ~ MultithreadOperation(). Además, he visto muchas recomendaciones para evitar cualquier código que se refiera a los recursos administrados en la implementación de Finalizar, especialmente los campos de instancia.
Además, sería interesante escuchar acerca de los diferentes enfoques para este problema. Gracias!
posible duplicado de [C# Finalize/Dispose pattern] (http://stackoverflow.com/questions/898828/c-finalize-dispose-pattern) – x0n
votación para cerrar. esto se ha preguntado y respondido un millón de veces en toda la web. reemplace "hilo" por "objeto gestionado" y la pregunta es un duplicado. – x0n
¿Qué tal si el subproceso seguirá vivo después de que MutilthreadOperation es basura? Este comportamiento es bastante malo. El tema que refirió sugiere no detener el hilo en el finalizador. – Alexander