Это ответ, извлеченный из комментариев под вопросом
Это , а не проблема, связанная с блокировкой.
Согласно комментариям, OP реализовано IComparer<Packet>
и передано в SortedSet<Packet>
. Сравнитель, хотя он используется коллекцией, метод Min
, являющийся расширением LINQ, не использует его.
Вместо этого Min
ожидает, что класс Packet
реализует IComparable
. И поскольку класс, похоже, не реализовал интерфейс, возникает исключение.
Min
не сравнивает объекты, когда коллекция содержит только 0 или 1 элементы. Когда коллекция содержит 2 или более элементов, Min
сравнивает Packet
и выдается исключение.
Согласно комментарию ФП, вот где путаница была:
Большую часть времени в буфере находится только 1 пакет (за исключением редких случаев неупорядоченных пакетов, которые я пытаюсь решить с этим буфером.)
Однако сообщение об ошибке в этом сценарии также может вводить в заблуждение:
Как минимум один объект должен реализовывать IComparable.
Это означает, что в наборе может не быть элементов.
Чтобы устранить эту проблему, поскольку наборы уже упорядочены, следует использовать First
или Last
в соответствии с реализацией IComparer<Packet>
.