private void RemoveInternal(UpdateDelegate update) { if (update == null) { return; } int key = update.GetHashCode(); UpdateItem updater; int removeAt = -1; if (mUpdating) { if (mUpdaters.TryGetValue(key, out updater)) { mUpdaters.Remove(key); removeAt = updater.index; if (mInterior >= updater.index) { mInterior--; } } else if (mNewUpdaters.RemoveFromQueue(key)) { removeAt = mInterior + mNewCount; mNewCount--; if (mNewCount > 0) { mNewPriority = mNewUpdaters.Peek().priority; } } } else { if (mUpdaters.TryGetValue(key, out updater)) { mUpdaters.Remove(key); removeAt = updater.index; } else { UpdateItem u; int p; if (mNewUpdaters.RemoveFromQueue(key, out u, out p)) { UpdateItem.Cache(u); } } } if (removeAt >= 0) { UpdateItem.Cache(mSortedUpdaters[removeAt]); mSortedUpdaters.RemoveAt(removeAt); for (int i = mSortedUpdaters.Count - 1; i >= removeAt; i--) { UpdateItem u = mSortedUpdaters[i]; u.index = i; } } }