Когда действие <T>получает мусор? - PullRequest
2 голосов
/ 12 октября 2011

У меня есть агрегатор событий, который использует WeakReferences для хранения Action<T>. Проблема, с которой я сталкиваюсь, состоит в том, что мои действия продолжают собирать мусор.

Следующее не получится ...

public Foo(IEventAggregator eventAggregator)
{
   eventAggregator.Subscribe<BarEvent>(DoNothing)
}

public void DoNothing(BarEvent aEvent) {}

И все же следующее удастся ...

private Action<BarEvent> _action;

public Foo(IEventAggregator eventAggregator)
{
  _action = DoNothing;
  eventAggregator.Subscribe<BarEvent>(_action);
}

public void DoNothing(BarEvent aEvent) {}

Очевидно, переменная _action помогает поддерживать жизнь, но я немного запуталась, почему ... и что более важно, есть ли способ сохранить действие без ссылки?

Ответы [ 2 ]

0 голосов
/ 12 октября 2011

Когда в Action собирается мусор?

Когда сборщик мусора чувствует себя так.

Класс WeakReference описан следующим образом:

Представляет слабую ссылку, которая ссылается на объект, в то же время позволяя этому объекту утилизироваться сборщиком мусора.

Другими словами, вы прямо сказали, что не возражаете, если объект будет собран. Вы не можете съесть свой торт и . Либо возьмите надежную ссылку, либо будьте готовы воссоздать объект, если он был собран.

0 голосов
/ 12 октября 2011

Я не думаю, что вы получите правильный «ответ», так как вы имеете дело с недокументированными внутренними данными о том, как сборщик мусора работает на вашем компьютере, как это сейчас настроено.

Изменить сборщик мусора:

  • LatencyMode
  • включить многопоточный сборщик мусора (gcConcurrent)
  • или переключитесь на серверный сборщик мусора (gcServer)

, и вы можете ожидать другое поведение.


Какойотвечаю на ваш вопрос: я не знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...