Beste Möglichkeit in .NET, die Aufgabenwarteschlange in einem separaten (einzelnen) Thread zu verwalten

Ich weiß, dass sich die asynchrone Programmierung im Laufe der Jahre stark verändert hat. Es ist mir etwas peinlich, dass ich mich mit 34 Jahren so verrosten lasse, aber ich zähle auf StackOverflow, um mich auf den neuesten Stand zu bringen.

Ich versuche, eine Warteschlange mit "Arbeit" in einem separaten Thread so zu verwalten, dass jeweils nur ein Element verarbeitet wird. Ich möchte Arbeiten an diesem Thread veröffentlichen und es muss nichts an den Anrufer zurückgegeben werden. Natürlich könnte ich einfach ein neues @ aufdrehThread Objekt und lassen Sie es über ein geteiltesQueue object, mit Sleeps, Interrupts, Wait-Handles, etc. Aber ich weiß, dass die Dinge seitdem besser geworden sind. Wir habenBlockingCollection, Task, async/await, ganz zu schweigen von NuGet-Paketen, die wahrscheinlich viel davon abstrahieren.

Ich weiß, dass "Was ist das Beste ..." - Fragen im Allgemeinen verpönt sind. Deshalb sage ich "Was ist das derzeit empfohlene ...", um so etwas mit Hilfe der eingebauten .NET-Mechanismen zu erreichen. Aber wenn ein NuGet-Paket eines Drittanbieters die Dinge ein wenig vereinfacht, ist es auch gut so.

Ich betrachtete einTaskScheduler Instanz mit einer festen maximalen Nebenläufigkeit von 1, aber es scheint, dass es wahrscheinlich einen viel weniger umständlichen Weg gibt, dies zu tun.

Hintergrun

In diesem Fall versuche ich, eine IP-Geolocation-Aufgabe während einer Webanforderung in die Warteschlange zu stellen. Dieselbe IP-Adresse wird möglicherweise mehrmals für die Standortbestimmung in die Warteschlange gestellt, aber die Task kann dies erkennen und frühzeitig überspringen, wenn sie bereits behoben wurde. Aber der Request-Handler wirft einfach diese() => LocateAddress(context.Request.UserHostAddress) ruft eine Warteschlange auf und lässt dasLocateAddress -Methode behandelt die Erkennung doppelter Arbeiten. Die von mir verwendete Geolocation-API möchte nicht mit Anfragen bombardiert werden, weshalb ich sie auf jeweils eine einzelne gleichzeitige Aufgabe beschränken möchte. Es wäre jedoch schön, wenn der Ansatz mit einer einfachen Parameteränderung problemlos auf mehr gleichzeitige Aufgaben skaliert werden könnte.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage