Mikrosekunde Verzögerung in NET-Anwendung müssen UDP-Multicast-Übertragungsrate zur Drosselung

StackOverflow https://stackoverflow.com/questions/1631501

Frage

Ich schreibe ein UDP-Multicast-Client / Server-Paar in C # und ich brauche eine Verzögerung in der Größenordnung von 50 bis 100 & mgr; s (Mikrosekunden), um die Server-Übertragungsrate zu drosseln. Dies hilft erhebliche Paketverluste zu vermeiden und hilft auch eine Überlastung der Kunden zu halten, die Disk-I sind / O Bindung. Bitte geben keine Hinweise auf Thread.Sleep oder Thread.SpinWait. Ich würde nicht fragen, ob ich entweder von denen, benötigt wird.

Mein erster Gedanke war eine Art von High-Performance-Zähler zu verwenden und eine einfache while () Schleife tun, um die verstrichene Zeit überprüft, aber ich möchte, dass vermeiden, wie es kludgey anfühlt. Wäre das nicht peg auch die CPU-Auslastung für den Serverprozess?

Bonuspunkte für eine Cross-Plattform-Lösung, das heißt nicht Windows-spezifisch. Vielen Dank im Voraus, Jungs!

War es hilfreich?

Lösung

würde ich Stoppuhr aber müsste ein Schleife

dieses mehr Erweiterung der Stoppuhr zu schreiben, ElapsedMicroseconds

oder so etwas wie dies könnte auch funktionieren

System.Diagnostics.Stopwatch.IsHighResolution muss wahr sein

    static void Main(string[] args)
    {
        Stopwatch sw;
        sw = Stopwatch.StartNew();
        int i = 0;

        while (sw.ElapsedMilliseconds <= 5000)
        {
            if (sw.Elapsed.Ticks % 100 == 0)
            { i++; /* do something*/ }
        }
        sw.Stop();


    }

Andere Tipps

Sehr kurze Schlafzeiten im Allgemeinen am besten durch eine CPU Spinschleife erreicht werden (wie die Art beschreiben Sie). Sie wollen in der Regel die hochgenaue Timer zu vermeiden, mit ruft da sie sich Zeit in Anspruch nehmen und die Ergebnisse verfälschen. Ich würde nicht zu viele Sorgen über CPU auf dem Server für solche kurzen Wartezeiten pegging.

Ich würde das Verhalten in einer Klasse kapseln, wie folgt:

  • Erstellen Sie eine Klasse, deren statischen Konstruktor läuft eine Spinschleife für mehrere Millionen Iterationen und erfaßt, wie lange es dauert. Dies gibt Ihnen eine Vorstellung davon, wie lange eine einzelne Schleifenzyklus auf der zugrunde liegenden Hardware nehmen würde.
  • Berechnen Sie einen uS / Iteration Wert, den Sie verwenden können beliebige Schlafzeiten zu berechnen.
  • Wenn für einen bestimmten Zeitraum schlafen gebeten, teilt die von der uS / Iteration Wert schläft zuvor berechneten, wie viele Iterationen zu identifizieren auszuführen.
  • Spin eine while-Schleife, bis die geschätzte Zeit verstreicht verwendet wird.

Ich habe mit einer solchen Anforderung erfahren, wenn ich mehr Präzision mit meiner Multicast-Anwendung benötigt werden.

Ich habe festgestellt, dass die beste Lösung mit dem MultiMedia-Timer liegt wie in dieses Beispiel .

Ich habe diese Implementierung verwendet und fügte hinzu TPL async, um es aufzurufen. Sie sollten meine SimpleMulticastAnalyzer Projekt für weitere Informationen.

    static void udelay(long us)
    {
        var sw = System.Diagnostics.Stopwatch.StartNew();
        long v = (us * System.Diagnostics.Stopwatch.Frequency )/ 1000000;
        while (sw.ElapsedTicks < v)
        {
        }
    }
    static void Main(string[] args)
    {
        for (int i = 0; i < 100; i++)
        {
            Console.WriteLine("" + i + " " + DateTime.Now.Second + "." + DateTime.Now.Millisecond);
            udelay(1000000);
        }
    }

Haben Sie sich unter Multimedia-Timer ? Sie könnten wahrscheinlich eine .NET-Bibliothek irgendwo finden, dass der API wickelt ruft irgendwo.

würde ich mit Spinschleife entmutigen, wie es verbraucht und erzeugt Thread blockiert. Thread.Sleep ist besser, es nicht Prozessorressourcen während des Schlafes benutzen, es ist nur die Zeit, in Scheiben schneiden. Probieren Sie es aus, und Sie werden von Task-Manager sehen, wie die CPU-Auslastung Spitze mit der Spin-Schleife.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top