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?

回答

相關問題