这是糟糕的程序吗?

本文关键字:程序 | 更新日期: 2023-09-27 18:11:32

这是坏程序吗?

DateTime dtExpire = DateTime.Now.AddSeconds(90);
while (client.Connected && DateTime.Now < dtExpire)
{
    if (client.Available == 0) continue;
    //or can also use: if (!networkStream.DataAvailable) continue;
    dtExpire = DateTime.Now.AddSeconds(30);
    //now do stuff with client via stream
}

目标是确保客户端处理传入消息的时间不会超过服务器愿意等待的时间。当然,这段代码位于Try/Catch块以及Using Stream块中,因此服务器将优雅地处理丢失的连接或任何其他套接字异常。

基本上,我只是想知道是否有更好的方法来处理这个问题。谢谢。

这是糟糕的程序吗?

使用ReceiveTimeout属性指定等待传入消息的时间。当您使用Receive方法(或其方法族)并发生超时时,将抛出SocketException

client.ReceiveTimeout = 90;

如果您必须异步完成此操作,则代码将更加复杂,但看起来并非如此。Receive本身应该完成这项工作,因为它将阻塞当前线程。

这叫做等待忙。

你实际上阻塞了CPU,即使没有"真正的"工作要做(例如,当你只是等待client.Available变为不同于0时)。幸运的是,你忙碌的等待有一个超时,所以至少它不会永远阻塞CPU。

你是否能更有效地做到这一点,实际上只取决于client是什么,以及它是否实现了更有效的等待策略。

如果没有,那么您将被某种形式的忙碌等待所困,但并不是所有的等待都失去了-如果您可以容忍在检测client.Available中的变化时稍微延迟,那么执行…

if (client.Available == 0) {
   Thread.Sleep(max_delay_you_can_tolerate);
   continue;
}

…可以大大减轻CPU的压力

—EDIT—

如果client实际上是Socket,请查看BlockingReceiveTimeout属性