C# 这是糟糕的编程吗?
这是糟糕的编程吗C# 这是糟糕的编程吗?,c#,.net,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 = Dat
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
}
DateTime dtExpire=DateTime.Now.AddSeconds(90);
while(client.Connected&&DateTime.Now
其目标是确保客户机在处理传入消息时所花费的时间不会超过服务器愿意等待的时间。当然,这段代码位于Try/Catch块和Using Stream块的内部,因此服务器可以优雅地处理断开的连接或任何其他套接字异常
基本上,我只是想知道是否有更好的方法来处理这个问题。谢谢。使用
ReceiveTimeout
属性指定等待传入消息的时间。使用Receive
方法(或其方法系列)并发生超时时,将抛出SocketException
client.ReceiveTimeout = 90;
如果您必须异步完成此任务,那么您的代码将更加复杂,但看起来并不是这样Receive本身应该执行此任务,因为它将在当前线程上阻塞。这称为
即使没有“真正”的工作要做(即,当您只是等待客户端可用时,也会堵塞CPU。幸运的是,您的繁忙等待有一个超时,因此至少不会永远阻塞CPU
您是否能够更高效地完成这项工作实际上只取决于客户机是什么,以及它是否实现了更高效的等待策略
如果没有,那么您将陷入某种形式的繁忙等待,但并不是所有内容都丢失了-如果您能够容忍在检测客户端.Available
中的更改时出现轻微延迟,那么请执行
if (client.Available == 0) {
Thread.Sleep(max_delay_you_can_tolerate);
continue;
}
…将大大减轻CPU的压力
---编辑---
如果客户端
实际上是一个套接字
,请查看阻塞
和接收超时
属性。这与TCP无关,除了一些与实际问题无关的模糊网络操作。请正确地重新标记,从您在此处使用的语言(c#?)开始。这可能更适合代码审阅。请编辑问题的标题。它太普通了…谢谢,这就是我想要的;我已经添加了ReceiveTimeout。