почему сборщик мусора, закрытие и лямбда отключают подписку на агрегатор событий призмы? - PullRequest
0 голосов
/ 07 марта 2019

У меня есть простое событие, определенное с помощью шаблона агрегатора событий PRISM

 public class TestEvent : PubSubEvent
    {
    }
    public static class PrismEvents
    {
        public static readonly IEventAggregator EventAggregator = new EventAggregator();
        public static readonly TestEvent EventTest = EventAggregator.GetEvent<TestEvent>();
    }

У меня есть класс подписчика, на который подписано это событие с использованием лямбды. Обратите внимание на использование локальной переменной (i) внутри кода подписки

public class SubScriber
    {
        public SubScriber()
        {
            int i = 5;
            PrismEvents.EventTest.Subscribe(() =>
            {
                Console.WriteLine("Event Fired");//not getting called
                i = 10; //commenting this line will execute the subscription code
            });
        }

    }

На стороне издателя создается подписчик, затем вызывается GC, затем публикуется событие.

Код подписки не выполняется!

 class Program
    {
        static void Main(string[] args)
        {
            new SubScriber();
            GC.Collect(); //commenting this line will execute the subscription code
            PrismEvents.EventTest.Publish();
            Console.ReadKey();
        }

    }

Пара баллов

  1. Комментирование использования локальной переменной (i = 10) исправит Проблема. Код подписки будет выполнен как ожидалось

  2. Комментирование GC.collect решит проблему. Код подписки будет выполнить как ожидалось

В чем причина такого поведения?

...