2017-03-25 11 views
0

UDPを使用して、待ち時間の少ない一連のデータを別のデバイスに送信します。C#UdpClient.Send getの速度が遅く、遅い

これは、問題を再現短い抜粋である:

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

関連する問題