La mejor manera en .NET para administrar la cola de tareas en un hilo separado (único)

Sé que la programación asincrónica ha visto muchos cambios a lo largo de los años. Me da un poco de vergüenza que me deje oxidarme con tan solo 34 años, pero cuento con StackOverflow para ponerme al día.

Lo que intento hacer es administrar una cola de "trabajo" en un hilo separado, pero de tal manera que solo se procese un elemento a la vez. Quiero publicar el trabajo en este hilo y no necesita pasar nada a la persona que llama. Por supuesto, simplemente podría girar un nuevoThread objetar y hacer que se repita sobre un elemento compartidoQueue objeto, durmiendo, interrupciones, esperas, etc. Pero sé que las cosas han mejorado desde entonces. TenemosBlockingCollection, Task, async/await, sin mencionar los paquetes de NuGet que probablemente resumen mucho de eso.

Sé que las preguntas de "¿Cuál es el mejor ..." generalmente están mal vistas, así que lo reformularé diciendo "Cuál es la forma recomendada actualmente ..." para lograr algo como esto utilizando preferiblemente mecanismos .NET integrados. Pero si un paquete NuGet de terceros simplifica las cosas un montón, es igual de bueno.

Consideré unTaskScheduler instancia con una concurrencia máxima fija de 1, pero parece que hay una forma mucho menos torpe de hacerlo por ahora.

Antecedentes

Específicamente, lo que estoy tratando de hacer en este caso es poner en cola una tarea de geolocalización de IP durante una solicitud web. La misma IP podría terminar en cola para la geolocalización varias veces, pero la tarea sabrá cómo detectar eso y omitirlo antes si ya se ha resuelto. Pero el controlador de solicitudes solo arrojará estos() => LocateAddress(context.Request.UserHostAddress) llama a una cola y deja que elLocateAddress Método de detección de trabajo duplicado. La API de geolocalización que estoy usando no me gusta que me bombardeen con solicitudes, por eso quiero limitarla a una sola tarea simultánea a la vez. Sin embargo, sería bueno si el enfoque se permitiera escalar fácilmente a tareas más concurrentes con un simple cambio de parámetros.

Respuestas a la pregunta(5)

Su respuesta a la pregunta