私はパブリッシャーとサブスクライバーを持っています。サブスクライバはパブリッシャから自身をサブスクライブします。 加入者が範囲外になると、そのイベントから退会して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
加入者に範囲外になったことを知らせる方法はありますか?ここで