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();
        }