private static void StatusDeleted(long statusId) { // registered as removed status _removes[statusId] = DateTime.Now; Task.Run(async() => { // find removed statuses var removeds = await StatusProxy.RemoveStatusAsync(statusId).ConfigureAwait(false); // notify removed ids foreach (var removed in removeds) { _removes[removed] = DateTime.Now; StatusBroadcaster.Enqueue(new StatusNotification(removed)); } // check cleanup cycle var stamp = DateTime.Now; if (stamp - _cleanupPeriod > _threshold) { // update period stamp _cleanupPeriod = stamp; // remove expireds _removes.Where(t => (stamp - t.Value) > _threshold) .ForEach(t => { // remove expired DateTime value; _removes.TryRemove(t.Key, out value); }); } }); }
private static async void StatusPump() { StatusNotification n; while (true) { _signal.Reset(); while (_queue.TryDequeue(out n) && !_isHaltRequested) { var status = n.Status; if (n.IsAdded && status != null) { if (Setting.UseLightweightMute.Value && MuteBlockManager.IsUnwanted(status)) { // muted continue; } // check registered as removed or not var removed = IsRegisteredAsRemoved(status.Id) || (status.RetweetedStatus != null && IsRegisteredAsRemoved(status.RetweetedStatus.Id)); // check status is registered as removed or already received if (removed || !await StatusReceived(status).ConfigureAwait(false)) { continue; } StatusBroadcaster.Enqueue(n); } else { StatusDeleted(n.StatusId); } // post next _signal.Reset(); } if (_isHaltRequested) { break; } _signal.Wait(); } _signal.Dispose(); }