Bonjour! Supposons que nous avons la classe suivante:Implémentation IDisposable pour la classe qui contient des threads
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 fait, je dois arrêter tous les fils si l'instance est disposé. Aussi, j'ai besoin d'arrêter tous les threads si l'instance est garbage collectée (sinon, les threads seront encore vivants, ce qui est mauvais pour moi). Certainement, il est tout à fait légal d'invoquer la méthode StopOperation() à la place # 1.
Je veux savoir s'il y a des pièges si nous invoquons StopOperation() à l'endroit n ° 2? Si je comprends bien, la liste des threads peut déjà être collectée lorsque le ~ MultithreadOperation() est en cours d'exécution. En outre, j'ai vu beaucoup de recommandations pour éviter tout code qui fait référence aux ressources gérées dans l'implémentation Finalize, en particulier les champs d'instance.
En outre, il serait intéressant d'entendre des approches différentes pour ce problème. Merci!
double possible de [C# Finaliser/pattern Dispose] (http://stackoverflow.com/questions/898828/c-finalize-dispose-pattern) – x0n
vote pour fermer. Cela a été demandé et répondu un million de fois partout sur le web. remplacer "thread" par "objet géré" et la question est un doublon. – x0n
Que diriez-vous que le Thread sera toujours vivant après que MutilthreadOperation ait été récupéré? Ce comportement est assez mauvais. Le sujet que vous avez référé suggère de ne pas arrêter le thread dans le finaliseur. – Alexander