我已经尝试了所有我能想到的东西,我准备好把头发拉出来。我有一个应用程序使用TCPClient,NetworkStream,StreamWriter和StreamReader与调制解调器通信。调制解调器每小时只接受一个连接,所以我必须打开我的连接。我刚刚切换到一个新的调制解调器,显然在几个小时后停止通信,但保持网络连接打开。我已将NetworkStream.ReadTimeout和NetworkStream.WriteTimeout属性设置为1000毫秒,但是当调制解调器停止通信时,不是StreamWriter超时,而是开始使用我计算机的50%的CPU。没有无限循环,它停在我的代码中的单个StreamWriter.WriteLine()上。非常感谢任何帮助。
丹
答案 0 :(得分:2)
在某个地方,甚至在你只使用但没有写的代码中,有一个看起来像这样的循环:
while (condition)
{
condition = checkCondition(); //possibly looking for new data from the socket
}
你有一台双核计算机,这个循环占用了来自一个核心的所有cpu时间。解决此问题的最简单方法是向循环添加一个睡眠调用:
while (condition)
{
Thread.Sleep(100);
condition = checkCondition();
}
但同样,此代码可能隐藏在您正在使用的函数调用中,您无法在其中进行更改。如果是这种情况,您可能需要查看您正在使用的类,并找到一种等待不依赖于违规函数的数据的替代方法。
您可以通过在bugger中运行应用程序找出导致问题的功能,等待它达到问题状态,然后暂停执行。稍微介绍一下程序,问题就变得非常明显了。