System.ComponentModel.WeakHashtable.ScavengeKeys C# (CSharp) Method

ScavengeKeys() private method

private ScavengeKeys ( ) : void
return void
        private void ScavengeKeys()
        {
            int hashCount = Count;

            if (hashCount == 0)
            {
                return;
            }

            if (_lastHashCount == 0)
            {
                _lastHashCount = hashCount;
                return;
            }

            long globalMem = GC.GetTotalMemory(false);

            if (_lastGlobalMem == 0)
            {
                _lastGlobalMem = globalMem;
                return;
            }

            float memDelta = (float)(globalMem - _lastGlobalMem) / (float)_lastGlobalMem;
            float hashDelta = (float)(hashCount - _lastHashCount) / (float)_lastHashCount;

            if (memDelta < 0 && hashDelta >= 0)
            {
                // Perform a scavenge through our keys, looking
                // for dead references.
                //
                ArrayList cleanupList = null;
                foreach(object o in Keys)
                {
                    WeakReference wr = o as WeakReference;
                    if (wr != null && !wr.IsAlive)
                    {
                        if (cleanupList == null)
                        {
                            cleanupList = new ArrayList();
                        }

                        cleanupList.Add(wr);
                    }
                }

                if (cleanupList != null)
                {
                    foreach(object o in cleanupList)
                    {
                        Remove(o);
                    }
                }
            }
        
            _lastGlobalMem = globalMem;
            _lastHashCount = hashCount;
        }