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 Session中に加入して以来、Serviceは今、そのSessionへの参照を持って、GCedではありませんしています。

私の場合、CreateSessionメソッドを変更することはできません。また、サブスクライバの構築/破壊を制御することはできません。Sessionを実装していないと、 Serviceから。

(私の場合は、PrismとMVVMでSilverlightを使用していますが、Prismは加入者であるViewModelのライフタイムを制御しますが、問題はないと思います。私のVMはPrism

加入者に範囲外になったことを知らせる方法はありますか?ここで

答えて

関連する問題