private Task ProcessQueue() { try { while (!_cancellationToken.IsCancellationRequested) { KeyValuePair <int, Package> pair; if (_queue.TryPeek(out pair)) { if (pair.Key == _lastSequenceNumber + 1) { if (_queue.TryDequeue(out pair)) { _lastSequenceNumber = pair.Key; HandlePackage(pair.Value, this); if (_queue.Count == 0) { WaitHandle.SignalAndWait(_mainWaitEvent, _waitEvent, TimeSpan.FromMilliseconds(50), true); } } } else if (pair.Key <= _lastSequenceNumber) { if (Log.IsDebugEnabled) { Log.Warn($"{Username} - Resent. Expected {_lastSequenceNumber + 1}, but was {pair.Key}."); } if (_queue.TryDequeue(out pair)) { pair.Value.PutPool(); } } else { if (Log.IsDebugEnabled) { Log.Warn($"{Username} - Wrong sequence. Expected {_lastSequenceNumber + 1}, but was {pair.Key}."); } WaitHandle.SignalAndWait(_mainWaitEvent, _waitEvent, TimeSpan.FromMilliseconds(50), true); } } else { if (_queue.Count == 0) { WaitHandle.SignalAndWait(_mainWaitEvent, _waitEvent, TimeSpan.FromMilliseconds(50), true); } } } } catch (Exception e) { Log.Error($"Exit receive handler task for player", e); } return(Task.CompletedTask); }
public IList <BaseEvent> Dequeue(long t) { var eList = new List <BaseEvent>(); KeyValuePair <long, BaseEvent> pair; while (pQueue.Count > 0) { while (!pQueue.TryPeek(out pair)) { ; } if (pair.Value.Time > t) { break; } while (!pQueue.TryDequeue(out pair)) { ; } eList.Add(pair.Value); } return(eList); }
public void Priorities() { var q = new ConcurrentPriorityQueue <int>(); var values = new int[10000]; var r = new Random(0); for (int i = 0; i < values.Length; i++) { int value; switch (r.Next(3)) { case 0: value = 0; break; case 1: value = int.MaxValue; break; default: value = 0x7FFFFFFF & r.Next(); break; } values[i] = value; q.Enqueue(value, value); } Array.Sort(values); Array.Reverse(values); int dequeuedPriority0, dequeuedValue0, dequeuedPriority1, dequeuedValue1; foreach (int t in values) { XAssert.IsTrue(q.TryPeek(out dequeuedPriority0, out dequeuedValue0)); XAssert.IsTrue(q.TryDequeue(out dequeuedPriority1, out dequeuedValue1)); XAssert.AreEqual(dequeuedPriority0, dequeuedPriority0); XAssert.AreEqual(dequeuedPriority1, dequeuedPriority1); XAssert.AreEqual(t, dequeuedValue1); } XAssert.IsFalse(q.TryPeek(out dequeuedPriority0, out dequeuedValue0)); XAssert.IsFalse(q.TryDequeue(out dequeuedPriority1, out dequeuedValue1)); }
private void ProcessOrderedQueue() { try { while (!_cancellationToken.IsCancellationRequested && !ConnectionInfo.IsEmulator) { if (_orderingBufferQueue.TryPeek(out KeyValuePair <int, Packet> pair)) { if (pair.Key == _lastOrderingIndex + 1) { if (_orderingBufferQueue.TryDequeue(out pair)) { //Log.Debug($"Handling packet ordering index={pair.Value.ReliabilityHeader.OrderingIndex}. Current index={_lastOrderingIndex}"); _lastOrderingIndex = pair.Key; HandlePacket(pair.Value); if (_orderingBufferQueue.Count == 0) { WaitHandle.SignalAndWait(_packetHandledWaitEvent, _packetQueuedWaitEvent, 500, true); } } } else if (pair.Key <= _lastOrderingIndex) { if (Log.IsDebugEnabled) { Log.Debug($"{Username} - Resent. Expected {_lastOrderingIndex + 1}, but was {pair.Key}."); } if (_orderingBufferQueue.TryDequeue(out pair)) { pair.Value.PutPool(); } } else { if (Log.IsDebugEnabled) { Log.Debug($"{Username} - Wrong sequence. Expected {_lastOrderingIndex + 1}, but was {pair.Key}."); } WaitHandle.SignalAndWait(_packetHandledWaitEvent, _packetQueuedWaitEvent, 500, true); } } else { if (_orderingBufferQueue.Count == 0) { WaitHandle.SignalAndWait(_packetHandledWaitEvent, _packetQueuedWaitEvent, 500, true); } } } } catch (ObjectDisposedException) { // Ignore. Comes from the reset events being waited on while being disposed. Not a problem. } catch (Exception e) { Log.Error($"Exit receive handler task for player", e); } }