我有一个具有 ConcurrentDictionary 作为私有成员的类。此类还定义了委托/回调方法。基类将此方法注册为外部事件的回调。这是只有一次。
我正在运行 ANT 内存分析器,我看到从数百个 ConcurrentDictionary 属性实例引用的 MyObj 实例有 1000 个。这些的 GC 根是事件回调。
这似乎导致内存在应用程序运行时显着增加。大约 5 分钟左右后,大部分内存被回收,但我担心应用程序可能会遇到问题,因为它会迅速膨胀在 GC 开始之前这么久。
这是怎么回事,我该如何解决?
这是注册处理程序的基本调用的片段
protected abstract void DataReceivedEventHandler(DataChangedEvent evt);
public virtual void RegisterForChanges(ICollection<MemoryTable> tables)
{
foreach (MemoryTable table in tables)
{
_subscribedTables.Add(table);
table.RegisterEventListener(new DataChangedCallBack(this.DataReceivedEventHandler));
}
}
这是在上述基类的子类中实现的处理程序:
private ConcurrentDictionary<string, DataRecord> _cachedRecords;
protected override void DataReceivedEventHandler(DataChangedEvent evt)
{
DataRecord record = evt.Record as DataRecord;
string key = record.Key;
if (string.IsNullOrEmpty(key)) { return; }
if (_cachedRecords.ContainsKey(key))
{
_cachedRecords[key] = record;
DateTime updateTime = record.UpdateTime;
TimeSpan delta = updateTime - _lastNotifyTime;
if (delta.TotalMilliseconds > _notificationFrequency)
{
PublishData(updateTime);
}
}
}
publishData 方法发布 prism 事件