Лучший способ в .NET управлять очередью задач в отдельном (одном) потоке

Я знаю, что за эти годы в асинхронном программировании произошло много изменений. Я немного смущен тем, что позволил себе стать ржавым всего в 34 года, но я рассчитываю на StackOverflow, чтобы ускорить меня.

Я пытаюсь управлять очередью «работа» в отдельном потоке, но таким образом, что одновременно обрабатывается только один элемент. Я хочу опубликовать работу в этой теме, и ей не нужно ничего передавать вызывающей стороне. Конечно, я мог бы просто раскрутить новыйThread объект и сделать его цикл по общемуQueue использование сна, прерываний, ручек ожидания и т. д. Но я знаю, что с тех пор все стало лучше. У нас естьBlockingCollection, Task, async/awaitне говоря уже о пакетах NuGet, которые, вероятно, абстрагируют многое из этого.

Я знаю, что вопросы «Что лучше ...», как правило, осуждаются, поэтому я перефразирую их словами: «Что в настоящее время рекомендуется ...», чтобы достичь чего-то подобного, предпочтительно используя встроенные механизмы .NET. Но если сторонний пакет NuGet упрощает работу, это также хорошо.

Я считалTaskScheduler Экземпляр с фиксированным максимальным параллелизмом 1, но, похоже, к настоящему моменту есть гораздо менее неуклюжий способ сделать это.

Фон

В частности, в этом случае я пытаюсь поставить в очередь задачу геолокации IP во время веб-запроса. Один и тот же IP может несколько раз попадать в очередь для геолокации, но задача будет знать, как его обнаружить и пропустить рано, если он уже решен. Но обработчик запросов просто собирается бросить эти() => LocateAddress(context.Request.UserHostAddress) звонит в очередь и пустьLocateAddress метод обработки дубликата работы обнаружения. API геолокации, который я использую, не любит, когда меня засыпают запросами, поэтому я хочу ограничить его одной одновременной задачей за раз. Однако было бы неплохо, если бы подход позволял легко масштабировать до более параллельных задач с простым изменением параметров.

Ответы на вопрос(5)

Ваш ответ на вопрос