2010-07-16 26 views
7

我需要一種方法來跟蹤各種類的實例,而這些類沒有任何知識,他們正在被跟蹤。基本上,我有一個類工廠創建實例並將它們交給另一個線程。一旦該線程完成並卸載實例,我需要得到通知,以便在所有實例都不在時,可以執行引用計數並從我的類工廠退出。獲取對象處理/銷燬的通知

挑戰是我無法修改任何我將加載的類,因爲我不控制它們的源代碼。

跟蹤我創建的實例很簡單,我可以在創建它們時將它們放入某種集合中。跟蹤他們的破壞會導致我的問題。如果我可以修改源代碼,我會爲每個類添加一個事件,並且當我創建一個實例時,我會掛鉤該事件並將其用作我的通知。但我不能那樣做。

所以,問題是這樣的:是否有一種偷偷摸摸的方式來監視對象實例並檢測它何時被銷燬?

回答

3

有沒有辦法獲得主動通知,但你可以保留一個WeakReference的對象,並定期檢查是否有任何死亡。

編輯:我喜歡裏德的答案比我的好!

+0

+1這很有趣 - 我一直在想同樣的東西,直到我看到他說他控制着物體構造的那個部分;) – 2010-07-16 18:41:27

+0

這實際上看起來好像它可能是我的情況下最可行的解決方案,我會試試這個。 – 2010-07-19 13:45:30

+0

我比Reed更喜歡你的,因爲這意味着這些類型的客戶不需要知道特殊的裝飾類型 – 2017-09-23 18:53:58

0

你怎麼樣控制物體的破壞:

public void Destroy(T obj) 
{ 
    if (obj == null) 
     throw new ArgumentNullException("obj"); 
    if (!_living.Contains(obj)) 
     throw new ArgumentException("Where did this obj come from?"); 

    using (obj as IDisposable) 
    { 

    } 

    _living.Remove(obj); // List? 
} 
+0

那麼什麼叫destroy()方法?請記住,我無法控制我正在加載的類型(事實上,它們是從一個文件夾動態加載的,並且事先並不知道我會在那裏找到什麼)。 – 2010-07-17 00:39:03

10

既然你創建的對象,好像你可以返回Decorator而不是實際的實例。

通過使用Decorator Pattern,您可以將返回的對象「包裝」到您自己的裝飾API中。裝飾可以提供一個提供銷燬通知的IDisposable實現。

+0

這很好。你可以使用反射來生成裝飾器。如果班級很龐大,這將非常重要。 – ChaosPandion 2010-07-16 18:41:31

+0

這很有意思,我會繼續。謝謝。 – 2010-07-16 18:46:23

2

如果你持有的引用的實例列表創建,他們將不會被回收,因此永遠不會被摧毀...

相反,你可以創建包含GUID的列表的存儲庫,創建爲每個實例添加一個新的Guid,然後將其添加到列表中 - 就像FactoryRepository一樣。通過這種方式,對於垃圾收集,您沒有引用問題,因爲Guid是結構而不是引用類型。然後,您可以從每個類繼承來創建一個可以通知銷燬的類型。我假設你不能改變原始類的代碼,你也不能改變這些類的使用者,因此類似decorator模式(通過接口)的東西已經被刪除,因爲類型不兼容。

非常簡單的例子:

public class OriginalClassDestroyNotifier : OriginalClass 
{ 
    private readonly Guid _instanceId; 

    public OriginalClassDestroyNotifier(Guid instanceId) 
    { 
     _instanceId = instanceId; 
    } 

    ~OriginalClassDestroyNotifier() 
    { 
     FactoryRepository.NotifyDestroyed(_instanceId); 
    } 
}