-2

考えられることはすべて試しましたが、髪を抜く準備が整いました。TCPClient、NetworkStream、StreamWriter、および StreamReader を使用してモデムと通信するアプリケーションがあります。モデムは 1 時間ごとに 1 つの接続しか受け付けないので、接続を開いたままにしておく必要があります。新しいモデムに切り替えたところ、数時間後に通信が停止したように見えますが、ネットワーク接続は開いたままです。NetworkStream.ReadTimeout および NetworkStream.WriteTimeout プロパティを 1000 ミリ秒に設定しましたが、モデムが通信を停止したときに StreamWriter がタイムアウトする代わりに、コンピューターの CPU の 50% を使用し始めます。無限ループはありません。コード内の単一の StreamWriter.WriteLine() で停止しています。どんな助けでも大歓迎です。

ダン

4

1 に答える 1

3

おそらく、使用するだけで記述していないコードのどこかに、次のようなループがあります。

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

デュアル コア コンピューターがあり、このループが 1 つのコアからすべての CPU 時間を消費しています。これを修正する最も簡単な方法は、スリープ呼び出しをループに追加することです。

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

ただし、このコードは、使用している関数呼び出しに隠されている可能性があり、変更することはできません。その場合は、使用しているクラスを調べて、問題のある関数に依存しないデータを待機する別の方法を見つける必要があります。

バガーでアプリを実行し、アプリが問題のある状態になるのを待ち、実行を一時停止することで、問題の原因となっている機能を特定できます。プログラムを少し実行すると、問題がどこにあるかがかなり明らかになるはずです。

于 2012-08-14T17:48:27.450 に答える