Par exemple, est-il nécessaire d'ajouter une instance de Timer à une liste comme je le fais ici pour éviter que le Timer soit collecté? Tyme si le rappel n'était pas anonyme l'aswer est oui, mais comme il est anonyme j'imagine que les variables dans le bloc de méthode qui sont accessibles dans le bloc de méthode anonyme ne seront collectées que lorsque la méthode anonyme sera terminée? Dans ce cas, pas besoin d'enregistrer ref comme je le fais ..:Quand les variables de méthode, accessibles dans une méthode anonyme, sont-elles collectées?
private static List<Timer> timers = new List<Timer>();
public static void RunCallbackAfter(Action callback, int secondsToWait)
{
Timer t = null;
t = new Timer(new TimerCallback(delegate(object state)
{
SomeThread.BeginInvoke(callback);
timers.Remove(t);
}), null, secondsToWait*1000, Timeout.Infinite);
timers.Add(t);
}
hein? s'il vous plaît eloborate – markmnl
ahh .. Je vois un _closure_ est le nom des variables accessibles à partir de la méthode anonyme – markmnl
Cependant, le rappel et le minuteur forment une référence circulaire; s'il y avait une référence extérieure au rappel, il n'y aurait pas de problème (sauf qu'il faudrait toucher la variable extérieure pour s'assurer que c'est dans la fermeture) ... – bdonlan