Mikrosekunden Verzögerung .NET-app für Drosselung von UDP-multicast-übertragungsrate
Schreibe ich einen UDP-multicast-client - /server-paar in C# und ich brauche eine Verzögerung in der Größenordnung von 50 bis 100 µsec (Mikrosekunden) zum drosseln der server transmission rate. Dies hilft zur Vermeidung von erheblichen packet loss und auch hilft zu verhindern, dass eine überlastung des Kunden, die Datenträger-E/A-gebunden. Bitte nicht schlagen-Thread.Sleep oder Thread.SpinWait. Ich würde nicht Fragen, wenn ich brauchte, entweder von denen.
War mein Erster Gedanke, eine Art von einem high-performance-counter-und nicht eine einfache while () - Schleife die überprüfung der verstrichenen Zeit, aber ich möchte vermeiden, dass, wie es sich anfühlt kludgey. Wäre das nicht auch peg die CPU-Auslastung für den server-Prozess?
Bonus-Punkte für die cross-Plattform-Lösung, D. H. nicht Windows-spezifisch. Vielen Dank im Voraus, Jungs!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde Stoppuhr, sondern müssten eine Schleife
Lesen diese mehr hinzuzufügen Erweiterung der Stoppuhr, wie ElapsedMicroseconds
oder sowas in der Art könnte zu arbeiten
System.Diagnostik.Stoppuhr.IsHighResolution MUSS wahr sein
Sehr kurze Schlafzeiten in der Regel am besten von einem CPU-spin-Schleife (wie die Art, die Sie beschreiben). Sie wollen in der Regel vermeiden Sie die Verwendung der high-precision timer-Aufrufe, wie Sie sich, nehmen Sie sich Zeit und die Ergebnisse verzerren. Ich würde nicht zu viel sorgen über die CPU-pegging auf dem server für solche kurzen Wartezeiten.
Ich würde Kapseln das Verhalten in einer Klasse wie folgt:
Ich erlebt habe mit einer solchen Forderung, wenn ich Sie brauchte mehr Präzision mit meiner multicast-Anwendung.
Habe ich herausgefunden, dass die beste Lösung sich befindet, mit dem MultiMedia-Timer wie in dieses Beispiel.
Habe ich verwendet diese Implementierung und fügte hinzu, TPL, async aufrufen, um es. Sie sollten sehen meine SimpleMulticastAnalyzer Projekt für weitere Informationen.
Haben Sie sich multimedia-Timer? Sie könnte wahrscheinlich finden .NET-library irgendwo umschließt, die die API-Aufrufe irgendwo.
Ich würde raten mit Hilfe von spin loop als es verbraucht und schafft blockierende Threads. thread.Schlaf ist besser, es nicht zu verwenden-Prozessor-Ressource während des Schlafes, ist es nur schneiden Sie die Zeit. Probieren Sie es aus, und sehen Sie aus der task-manager, wie die Spitze der CPU-Auslastung mit dem spin loop.
Thread.Sleep
. Versuchen Sie, ein paarThread.Sleep
telefonieren mit einemStopwatch
und Messen, wie genau Sie sind.