Я знаю, что за эти годы асинхронное программирование сильно изменилось. Я несколько смущен, что позволил себе получить этот ржавый всего лишь 34 года, но я рассчитываю на StackOverflow, чтобы довести меня до скорости.
То, что я пытаюсь сделать, это управлять очередью "работы" в отдельном потоке, но таким образом, что обрабатывается только один элемент за раз. Я хочу опубликовать работу над этим потоком, и ему не нужно передавать что-либо обратно вызывающему. Конечно, я мог бы просто развернуть новый объект Thread
и пропустить его через общий объект Queue
, используя спящие, прерывания, дескрипторы ожидания и т.д. Но я знаю, что с тех пор все стало лучше. Мы имеем BlockingCollection
, Task
, async
/await
, не говоря уже о пакетах NuGet, которые, вероятно, абстрагируются от этого.
Я знаю, что вопросы "Какие лучшие...", как правило, неодобрились, поэтому я буду перефразировать его, сказав "Что такое рекомендуемый..." способ сделать что-то подобное с помощью встроенных механизмов .NET предпочтительно. Но если сторонний пакет NuGet упрощает вещание, это тоже хорошо.
Я рассмотрел экземпляр TaskScheduler
с фиксированным максимумом concurrency из 1, но, похоже, на данный момент существует, вероятно, гораздо менее неуклюжий способ сделать это.
Фон
В частности, то, что я пытаюсь сделать в этом случае, - это очередь задачи геолокации IP во время веб-запроса. Один и тот же IP-адрес может несколько раз оказаться в очереди на геолокацию, но задача будет знать, как его обнаружить и ускорить, если он уже был разрешен. Но обработчик запроса просто собирается отправить эти вызовы () => LocateAddress(context.Request.UserHostAddress)
в очередь и позволить методу LocateAddress
обрабатывать двойное обнаружение работы. API-интерфейс геолокации, который я использую, не любит бомбардировать запросы, поэтому я хочу ограничить его одной одновременной задачей одновременно. Тем не менее, было бы неплохо, если бы подход позволил легко масштабировать до более параллельных задач с простым изменением параметров.