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不再需要它)
有没有一种方法可以让用户意识到超出范围让它有机会取消订阅和GCed?