调整窗体大小时网络滞后

本文关键字:网络 滞后 小时 窗体 调整 | 更新日期: 2023-09-27 18:06:30

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

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

故障
但当我开始调整gui表单的大小时,数据线程无法及时处理传入的数据。在那段时间里,我看到可用:2080,读取:2082,甚至available:5200,读取:5200

甚至更糟稍后,我计划解析传入的数据并在gui中呈现它。我预计这项操作将需要更多的cpu资源,网络进程将更加滞后。

问题
我能做些什么来减少网络滞后?

想法

  • 使用线程优先级
  • 表单调整大小时停止更新布局:
    这ResizeBegin+=(s,e(=>{this.SuspendLayout((;}
    这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);  
      }  
    }  
  }  
}  

调整窗体大小时网络滞后

readDataRunner不是在自己的线程中运行,而是在UI线程中运行时,可能会发生这种情况。把它移到一个单独的线程,你的问题就会消失。

你可以使用的东西:ThreadTaskBackgroundWorker

完全放弃你的想法,以下是的原因

  • 处理线程优先级(如果UI线程忙于处理非UI事务,这无关紧要(
  • 在调整表单大小时停止更新布局(不会解决您的问题,因为它与此处无关(
  • 数据速率太高,这一切都是徒劳的(事实并非如此,只有当你看到CPU和网络流量不断达到100%的峰值时,你才应该担心(