static WeakEventCleaner() { Thread thread = new Thread(() => { do { Thread.Sleep(Configuration.WeakEventCleanPeriod); int count = _singeWeakEventHandlersQueue.Count; do { _singeWeakEventHandlersQueue.TryDequeue(out var weakEventHandler); if (!weakEventHandler.TryUnsubscribe()) { _singeWeakEventHandlersQueue.Enqueue(weakEventHandler); } count--; } while (count > 0); count = _manyWeakEventHandlersQueue.Count; do { _manyWeakEventHandlersQueue.TryDequeue(out var weakEventHandlers); int removedCount = 0; int weakEventHandlersCount = weakEventHandlers.Count; for (int i = 0; i < weakEventHandlersCount; i++) { IWeakEventHandler weakEventHandler = weakEventHandlers[i - removedCount]; if (weakEventHandler.TryUnsubscribe()) { weakEventHandlers.RemoveAt(i - removedCount); } } if (removedCount < weakEventHandlersCount) { _manyWeakEventHandlersQueue.Enqueue(weakEventHandlers); } count--; } while (count > 0); } while (true); }); thread.IsBackground = true; thread.Name = "ObservableComputations cleaner"; thread.Start(); }