-2

我已经尝试了我能想到的一切,我准备把头发拔掉。我有一个使用 TCPClient、NetworkStream、StreamWriter 和 StreamReader 与调制解调器通信的应用程序。调制解调器每隔一小时左右只接受一个连接,所以我必须保持连接打开。我刚刚切换到一个新的调制解调器,它在几个小时后显然停止了通信,但它的网络连接保持打开状态。我已将 NetworkStream.ReadTimeout 和 NetworkStream.WriteTimeout 属性设置为 1000 毫秒,但是当调制解调器停止通信时 StreamWriter 不会超时,它只是开始使用我计算机 50% 的 CPU。没有无限循环,它在我的代码中的单个 StreamWriter.WriteLine() 上停止。任何帮助是极大的赞赏。

4

1 回答 1

3

在某个地方,甚至在您只使用但未编写的代码中,也有一个看起来像这样的循环:

while (condition)
{
    condition = checkCondition(); //possibly looking for new data from the socket
}

你有一台双核计算机,这个循环占用了一个核心的所有 cpu 时间。解决这个问题的最简单方法是在循环中添加一个 sleep 调用:

while (condition)
{
    Thread.Sleep(100);
    condition = checkCondition();
}

但同样,此代码可能隐藏在您正在使用的函数调用中,您无法更改它。如果是这种情况,您可能需要查看您正在使用的类,并找到一种替代方法来等待不依赖于违规函数的数据。

您可以通过在 bugger 中运行您的应用程序来找出导致问题的函数,等待它达到问题状态,然后暂停执行。稍微浏览一下程序,问题出在哪里应该会变得相当明显。

于 2012-08-14T17:48:27.450 回答