.NET 6 ahora tiene PriorityQueue<TElement,TPriority>, que es muy útil. El documento aún no está muy claro (concedido en el momento de la pregunta, la documentación aún es para RC1) si es seguro para subprocesos o no . Dos cosas:
Reside en System.Collections.Generic y no parece haber un equivalente en System.Collections.Concurrent .
Tiene un método llamado TryDequeue y TryPeek . De acuerdo, probablemente sean solo métodos que no arrojan una excepción cuando la cola está vacía, pero da una impresión de las colecciones concurrentes.
¿Puedo usarlo para un entorno de subprocesos múltiples sin envolver/bloquear (por ejemplo, en un sitio web de ASP.NET Core)? ¿Algún equivalente simultáneo que desconozco (intento no usar un paquete de terceros si es posible)?
Con un vistazo al código fuente de PriorityQueue.Enqueue , por ejemplo, es inmediatamente evidente que el código no es seguro para subprocesos:
public void Enqueue(TElement element, TPriority priority) { // Virtually add the node at the end of the underlying array. // Note that the node being enqueued does not need to be physically placed // there at this point, as such an assignment would be redundant. int currentSize = _size++; // <-- BOOMEl documento aún no es muy claro.
en realidad lo es Nada en .NET NO es seguro para subprocesos a menos que se mencione EXPLÍCITAMENTE en la documentación. Período.
La seguridad de subprocesos conlleva una sobrecarga de rendimiento (significativa), especialmente cuando se realiza de forma genérica (es decir, sin asumir usos específicos). Como tal, sería extremadamente estúpido hacer que todo sea seguro para subprocesos "por si acaso". De ahí el concepto general en .NET (desde la versión 1.0) de que NADA es seguro para subprocesos a menos que se mencione explícitamente en la documentación.
Como usted dice, la documentación no menciona la seguridad de los subprocesos. Como tal, es extremadamente claro que NO es seguro para subprocesos.