Il modo migliore in .NET per gestire la coda di attività su un thread separato (singolo)

So che la programmazione asincrona ha visto molti cambiamenti nel corso degli anni. Sono un po ‘imbarazzato che mi lascio prendere questo arrugginito a soli 34 anni, ma conto su StackOverflow per portarmi a pieno regime.

Quello che sto cercando di fare è gestire una coda di “lavoro” su un thread separato, ma in modo tale che solo un elemento viene elaborato alla volta. Voglio pubblicare il lavoro su questo thread e non è necessario passare nulla al chiamante. Ovviamente potrei semplicemente far ruotare un nuovo object Thread e farlo scorrere su un object Queue condiviso, usando sleep, interrupt, wait handle, ecc. Ma so che le cose sono migliorate da allora. Abbiamo BlockingCollection , Task , async / await , per non parlare dei pacchetti NuGet che probabilmente ne astraggono molto.

So che le domande “Quali sono le migliori …” sono generalmente disapprovate, quindi la riformulerò dicendo “Qual è il metodo attualmente consigliato …” per realizzare qualcosa del genere usando preferibilmente i meccanismi .NET integrati. Ma se un pacchetto NuGet di terze parti semplifica le cose un po ‘, lo è altrettanto.

Ho considerato un’istanza di TaskScheduler con una concorrenza massima fissa di 1, ma sembra che ci sia probabilmente un modo molto meno faticoso per farlo ora.

sfondo

Nello specifico, ciò che sto cercando di fare in questo caso è accodare un compito di geolocalizzazione IP durante una richiesta web. Lo stesso IP potrebbe finire per essere accodato per la geolocalizzazione più volte, ma l’attività saprà come rilevarlo e saltare presto se è già stato risolto. Ma il gestore della richiesta sta per lanciare queste chiamate () => LocateAddress(context.Request.UserHostAddress) in una coda e lasciare che il metodo LocateAddress gestisca il rilevamento del lavoro duplicato. L’API di geolocalizzazione che sto usando non ama essere bombardata da richieste, ed è per questo che voglio limitarla a una singola attività concorrente alla volta. Tuttavia, sarebbe bello se l’approccio fosse facilmente scalabile verso attività più concorrenti con un semplice cambio di parametro.