예를 들어 은 가비지 수집중인 타이머를 방지하기 위해 여기에서 수행하는 것처럼 타이머 인스턴스를 목록에 추가해야합니까? 사실 콜백이 익명이 아닌 경우 aswer는 yes입니다. 익명이므로 익명 메소드 블록에서 액세스 할 수있는 메소드 블록의 변수는 익명 메소드가 완료 될 때만 가비지 수집됩니다. 내가 뭐하는 거지 같은 경우에는 필요가 심판을 저장 없습니다 .. :익명 메소드에서 액세스 할 수있는 메소드 변수는 언제 가비지 수집됩니까?
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);
}
huh? – markmnl
아를 도와주세요 .. _closure_는 익명 메소드 – markmnl
에서 액세스 할 수있는 변수의 이름입니다. 그러나 콜백과 타이머는 순환 참조를 형성합니다. 콜백에 대한 외부 참조가 있다면 아무 문제가 없을 것입니다 (단, 클로저에 있는지 확인하기 위해 외부 변수를 만져야한다는 점만 제외하고는) ... – bdonlan