Объем закрытия и сборка мусора - PullRequest
2 голосов
/ 14 октября 2010

Я только что написал некоторый код для выполнения действия тайм-аута, если асинхронная задача занимает слишком много времени для обработки, но мне не ясно, когда и когда экземпляр тайм-аута когда-либо будет удален (я думаю, Так будет в случае, когда асинхронная задача завершается своевременно, но в остальном я понятия не имею), или если я собираюсь накапливать экземпляры каждый раз, когда вызываю этот код.

//StartNew creates a new instance of System.Timers.Timer, and 
//  invokes the ActionOnTimeout after 2000ms, unless calling code
//  calls "Stop" first
var timeout = ProcessTimeout.StartNew(() => ActionOnTimeout(), 2000);

//DoAsyncTask creates a new thread, does potentially slow stuff, 
///   then invokes this callback
DoAsyncTask(() => 
    {
         if(timeout.Running)
         {
             timeout.Stop();
             DoCallbackStuff();
         }
    });

(Если это поможет, класс ProcessTimeout использует System.Timers.Timer)

1 Ответ

6 голосов
/ 14 октября 2010

Не ясно, что timeout здесь или что DoAsyncTask делает, но несколько общих моментов:

  • Ваше лямбда-выражение захватит переменную timeout ,Он не будет захватывать значение переменной ... поэтому, если у вас есть что-то еще позже в том же методе, который устанавливает timeout в ноль или другое значение, исходное значение не будет сохраненов лямбда-выражении.
  • Лямбда-выражение будет предотвращать сбор мусора, на который ссылается timeout, до тех пор, пока сам делегат не подходит для сборки мусора
  • Сборка мусора - это не то же самое, что удаление.Вы говорите о том, «когда экземпляр тайм-аута когда-либо будет утилизирован» - что называется Dispose?На сборщик мусора это не повлияет, если только вы не полагаетесь на то, что финализатор вызывает для вас Dispose.
...