У меня есть простое событие, определенное с помощью шаблона агрегатора событий 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();
}
}
Пара баллов
Комментирование использования локальной переменной (i = 10) исправит
Проблема. Код подписки будет выполнен как ожидалось
Комментирование GC.collect решит проблему. Код подписки будет
выполнить как ожидалось
В чем причина такого поведения?