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?