0

我有一个发布者和订阅者。订阅者从发布者订阅自己。 我需要确保当订户超出范围时,它应该取消订阅该事件,以符合GC的条件。取消订阅事件处理程序以使订户符合GC条件的正确方法?

这是一个基本的场景:

class Service 
{ 
    public event Action PrintMessage; 
    public void RaisePrintMessage() 
    { 
    if (PrintMessage != null) PrintMessage(); 
    } 
} 

class Session 
{ 
    public Session(Service service) 
    { 
    _service = service; 
    _service.PrintMessage += _service_PrintMessage; 
    } 

    void _service_PrintMessage() 
    { 
    Console.WriteLine("Hello world"); 
    } 

    private readonly Service _service; 
    public Service Service 
    { 
    get 
    { 
     return _service; 
    } 
    } 

    ~Session() 
    { 
    Console.WriteLine("Session finalized."); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
    var service = new Service(); 
    CreateSession(service); 
    service.RaisePrintMessage(); 

    Console.ReadKey(); 
    } 

    private static void CreateSession(Service service) 
    { 
    var session = new Session(service); 
    } 
} 

,你可以期望的输出是Hello world(而不是Session finalized.),因为一旦用户订阅时Create SessionService现在已经得到了该Session参考,并不GCed 。

在我的情况下,我不能更改CreateSession方法,也不能控制订户的构建/销毁,我确实要确保我实现了Session,以便一旦超出范围就应该退订从Service。我个人的情况是我在Prism和MVVM中使用Silverlight,Prism控制着ViewModel这个用户的生命期,但我认为不重要,我想让我的VM知道Prism不再需要它)

有没有一种方法可以让用户意识到超出范围让它有机会取消订阅和GCed?

回答

相关问题