表单调整大小时网络滞后

时间:2014-06-03 11:49:07

标签: c# multithreading networking

前提
我有简单的网络原型 它有gui表单和后台线程(我称之为数据线程)来读取传入的数据。 数据线程监视socket中的可用数据并读取数据 从客户端以长度为1040字节的数据包传输的数据,速率约为每秒50条消息。


当程序工作时,套接字中的可用字节数等于线程读取的数据并等于数据包大小。在日志中,我看到如下内容: available:1040,读取:1040

故障
但是当我开始调整gui表单的大小时,数据线程无法及时处理传入的数据。在那段时间里,我看到可用:2080,读取:2082 或甚至可用:5200,读取:5200 。我想在表单呈现过程中socket会从网络中获取多条消息。

更糟糕 后来我计划解析传入的数据并在gui中呈现它。我预见到这种操作将需要更多的CPU资源,网络流程将更加滞后。

问题
我该怎么做才能减少网络延迟?

想法

  • 玩线程优先级。
  • 在表单调整大小时停止更新布局:
    this.ResizeBegin + =(s,e)=> {this.SuspendLayout(); };
    this.ResizeEnd + =(s,e)=> {this.ResumeLayout(true); };

  • 数据率太高,一切都是徒劳的。

部分代码
数据线程代码:

void readDataRunner()  
{  
  log("readdata thread started");  
  while (!bStopReadDataThread)  
  {  
    if (client != null)  
    {  
      int bytesAvailable = 0;  
      bytesAvailable = client.Client.Available;  

      if (bytesAvailable > 0)  
      {  
        //create buffer and read data from socket
        byte[] bt = new byte[bytesAvailable];  
        int readed = client.Client.Receive(bt);  

        //extract header from message
        NetMessage header = new NetMessage();  
        header.setDefaultValues();  
        byte[] b = new byte[16];  
        Array.Copy(bt, b, 16);  
        header = tools.fromBytes(b);  

        //debug message
        System.Diagnostics.Debug.WriteLine("available:" + bytesAvailable + "\tread:" + readed);  
      }  
    }  
  }  
}  

1 个答案:

答案 0 :(得分:0)

readDataRunner没有在自己的线程中运行,而是在UI线程中时,可能会发生这种情况。将其移至单独的主题,您的问题就会消失。

您可以使用的内容:ThreadTaskBackgroundWorker

完全放弃你的想法,这就是为什么

  • 使用线程优先级(如果您的UI线程忙于非UI内容,这将无所谓)
  • 在表单调整大小时停止更新布局(由于此处不相关,因此无法解决您的问题)
  • 数据速率太高,一切都是徒劳的(不是这样,当你看到CPU和网络流量持续达到100%时,你应该只关心)