-2

1 分に 1 回、いくつかの設定を設定するスレッドを実行するサービスを作成しました。

サービスは本来の機能を果たしますが、CPU 使用率が非常に高くなることがわかりました (デュアル コアで約 25%)。

試行錯誤の結果、次のオブジェクトが問題の原因であることがわかりました。

private AsyncPipes.NamedPipeStreamServer pipeServer = new NamedPipeStreamServer("NotifyToService");
private AsyncPipes.NamedPipeStreamClient pipeClient = new NamedPipeStreamClient("ServiceToNotify");

名前付きパイプがインスタンス化されるだけで CPU を大量に使用するのは正常ですか?

4

3 に答える 3

5

あなたの結果を再現できます (私の 8 コア CPU では 13% を除く)。この記事の最後から AsyncPipes ライブラリをダウンロードしてビルドする必要がありました。問題は、コードが1 秒に 1 回NamedPipeStreamClientスローしていることです。System.TimeoutException

悪い設計の方法で、 のコンストラクターは、いくつかのクラス メンバーを設定した後にNamedPipeStreamClient呼び出されるメソッドを呼び出しています。StartTryConnect()

次に、そのメソッドは、メソッドを呼び出すバックグラウンド スレッドを開始しますTryConnect。ここでタイトなループに入ります。

while (!this._Stream.IsConnected)
{
    try
    {
        ((NamedPipeClientStream) this._Stream).Connect(0x3e8);
    }
    catch
    {
    }
}

クライアントが接続しようとしているサーバー (「ServiceToNotify」) が実際に開始されるまで、これは当てはまります。ただし、その名前の名前付きパイプサーバー (反対の「NotifyToService」があります) が起動している場所はどこにもありません。

ただし、サーバーに接続すると、CPU 使用率は予想どおりに低下します。

于 2013-06-19T15:59:25.197 に答える