public int Compare(WrappedEnvelope x, WrappedEnvelope y) { var baseCompare = priorityCalculator(x.Envelope.Message).CompareTo(priorityCalculator(y.Envelope.Message)); if (baseCompare != 0) { return(baseCompare); } return(x.SequenceNumber.CompareTo(y.SequenceNumber)); }
/// <summary> /// Enqueues a message into the priority queue. /// </summary> /// <param name="item">The item to enqueue.</param> public void Enqueue(Envelope item) { int seq = Interlocked.Increment(ref sequenceNumber); var wrappedItem = new WrappedEnvelope(item, seq); _data.Add(wrappedItem); var ci = _data.Count - 1; // child index; start at end while (ci > 0) { var pi = (ci - 1) / 2; // parent index if (comparator.Compare(_data[ci], _data[pi]) >= 0) break; // child item is larger than (or equal) parent so we're done var tmp = _data[ci]; _data[ci] = _data[pi]; _data[pi] = tmp; ci = pi; } }