C# 当窗体调整大小时,网络延迟

C# 当窗体调整大小时,网络延迟,c#,multithreading,networking,C#,Multithreading,Networking,前提 我有一个简单的网络原型。 它有gui窗体和后台线程(我称之为数据线程)来读取传入的数据。数据线程监视套接字中的可用数据并读取数据。 从客户端以1040字节长的数据包传输的数据,大约每秒50条消息 常规的 当程序运行时,套接字中的可用字节数等于线程读取的数据量,等于数据包大小。在日志中,我看到如下内容:可用:1040,读取:1040 麻烦 但当我开始调整gui窗体的大小时,数据线程无法及时处理传入的数据。在这段时间里,我看到了可用:2080,读:2082,甚至可用:5200,读:5200。我

前提
我有一个简单的网络原型。

它有gui窗体和后台线程(我称之为数据线程)来读取传入的数据。数据线程监视套接字中的可用数据并读取数据。
从客户端以1040字节长的数据包传输的数据,大约每秒50条消息

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

麻烦
但当我开始调整gui窗体的大小时,数据线程无法及时处理传入的数据。在这段时间里,我看到了可用:2080,读:2082,甚至可用:5200,读:5200。我假设在表单呈现过程中,套接字从网络中获取多条消息

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

问题
如何减少网络延迟

想法

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

  • 数据率太高,一切都白费了

一些代码
数据线程代码:


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

您可以使用的东西:
线程
任务
后台工作人员

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

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

发布相关代码。为什么渲染对套接字甚至工作线程都很重要?我很困惑。除了从工作线程中的套接字读取数据之外,您还做了什么吗?“它有gui窗体和后台线程(我称之为数据线程)来读取传入的数据”
readDataRunner
已在单独的线程(数据线程)中运行。
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);  
      }  
    }  
  }  
}