这是不好的编程吗?

时间:2011-10-15 03:53:58

标签: c# .net

这是不好的编程?

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块,因此服务器可以优雅地处理丢弃的连接或任何其他套接字异常。

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

2 个答案:

答案 0 :(得分:4)

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

client.ReceiveTimeout = 90;

如果必须以异步方式完成此操作,您的代码将会更复杂,但它看起来并不像您。 Receive本身应该完成这项工作,因为它将阻止当前线程。

答案 1 :(得分:1)

这称为busy waiting

即使没有“真正的”工作要做(即当你只是等待client.Available与0不同时),你本质上也会堵塞CPU。幸运的是,你忙碌的等待有一个超时,所以至少它不会永远堵塞CPU。

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

如果没有,那么你将会遇到某种形式的忙碌等待,但并非全部都会丢失 - 如果你能够忍受在client.Available中检测到变化的轻微延迟,那么......

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

......将在很大程度上减轻CPU的压力。

---编辑---

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