2017-03-25 4 views
0

Ich möchte eine Reihe von Daten mit niedriger Latenz an ein anderes Gerät mit UDP senden.C# UdpClient.Send wird langsamer und langsamer

Dies ist ein kurzer Ausschnitt, der das Problem reproduziert:

private void Form1_Shown(object sender, EventArgs e) 
    { 
     UdpClient udpClient = new UdpClient(9000); 
     IPEndPoint endPoint = new IPEndPoint(IPAddress.Broadcast, 7000); 

     new Thread(() => 
     { 
      Stopwatch stopwatch = new Stopwatch(); 
      byte[] buffer = new byte[1922]; 
      while (true) 
      {   
       stopwatch.Start(); 
       udpClient.Send(buffer, buffer.Length, endPoint); 
       stopwatch.Stop(); 
       Console.WriteLine("Sending took " + stopwatch.ElapsedMilliseconds + "ms"); // stopwatch.ElapsedMilliseconds gets higher and higher 
       Thread.Sleep(10); 
      } 
     }).Start(); 
    } 

Der Puffer hat die gleiche Größe jedes Mal (in der Schleife), und die Pakete alle 10 ms gesendet ... normal.

Aber ca. alle 300ms dauert es 1 zusätzliche Millisekunde zu senden, also dauert es nach kurzer Zeit bereits 1 Minute, um ein Paket zu senden.

Was ist das Problem dort und wie repariere ich es?

+1

Es scheint mir, als ob die Frage zu breit ist, da Ihre Frage spezifischer betrifft zu beantworten anstatt allgemeinen Fall, die durch andere Mittel als die verursacht werden können, in Ihrem Codebeispiel zur Verfügung gestellt wurden. Bitte geben Sie mehr Details an. – Lu4

+0

Ich habe den Post bearbeitet, es gibt jetzt einen Codeausschnitt, der das Problem reproduziert. – Skycoder

Antwort

0

Das Problem liegt in Ihrer Messung: Sie setzen Ihre Stoppuhr nicht irgendwo zurück. Rufen Sie stattdessen die Methode stopwatch.Start() auf, rufen Sie stattdessen die Methode Restart() auf.

Stopwatch Class (MSDN)

Restart(): Stoppen Intervallmesszeit, setzt die verstrichene Zeit auf Null und startet die verstrichene Zeit zu messen.

while (true) 
{   
    stopwatch.Restart(); 
    udpClient.Send(buffer, buffer.Length, endPoint); 
    stopwatch.Stop(); 
    Console.WriteLine("Sending took " + stopwatch.ElapsedMilliseconds + "ms"); 
    Thread.Sleep(10); 
} 
+1

Wow, ich fühle mich jetzt so dumm, ich habe mir die ganze Zeit über den UDPClient Sorgen gemacht, aber nie auf die Stoppuhr geschaut. Vielen Dank! – Skycoder

Verwandte Themen