2017-03-25 42 views
0

我想發送一串低延遲的數據到另一個使用UDP的設備。C#UdpClient.Send得到的速度越來越慢

這是一個短代碼段能重現問題:

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(); 
    } 

緩衝器具有相同的大小,每次(在循環中)和數據包每10ms發送...正常。

但是,每隔300ms需要1毫秒的時間才能發送,所以在短時間內發送數據包需要1分鐘。

那裏有什麼問題,我該如何解決?

+1

在我看來,好像這個問題太寬而不能回答,因爲你的問題而言特定的,而不是可以通過比在你的代碼示例中提供的其他方式引起一般情況。請提供更多細節。 – Lu4

+0

我編輯了這篇文章,現在有一個代碼片段,它重現了這個問題。 – Skycoder

回答

0

問題出在您的測量上:您沒有在任何地方重置您的秒錶。而不是調用stopwatch.Start()方法,而是調用Restart()方法。

Stopwatch Class (MSDN)

重啓():停止的時間間隔測量,將經過時間復位到零,並開始測量經過的時間。

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

哇,我現在覺得很愚蠢,我一直在擔心UDPClient,但從來沒有看過秒錶。謝謝! – Skycoder