1

ErrorProviderコントロールが複数のコントロールで点滅するアイコンを継続的に設定すると、CPU使用率が高くなる(時間の経過とともにゆっくりと)アプリケーションがあります。

高いCPU使用率はすぐには発生しませんが、アプリケーションが100%CPUに達するまではゆっくりと上昇します。

エラーが表示されない場合、CPUは通常に戻ります。ErrorProviderが非常に多くのCPU時間を費やすのは正常ですか?

4

2 に答える 2

3

これは正常ではありません。おそらく、メモリまたはウィンドウハンドルがリークしています。Taskmgr.exeの[プロセス]タブでこれの診断を開始します。[列の表示]+[選択]をクリックし、[メモリ(コミットサイズ)]、[ハンドル]、[USERオブジェクト]、および[GDIオブジェクト]にチェックマークを付けます。アプリの実行中は、これらの列の値を確認してください。

値が着実に増加している場合は、CPU使用率を上げる可能性のあるコードの問題を示しています。かなり古典的な問題は、Controls.Remove()またはControls.Clear()を使用してフォームからコントロールを削除し、それらのコントロールを破棄し忘れることによって引き起こされるUSERハンドルのリークです。

于 2011-03-31T13:31:47.077 に答える
2

このMS接続バグレポートによると:Graphical Resources Leak In ErrorProvider

コントロールに関連するエラーがある場合、ErrorProviderコンポーネントの右側に点滅するアイコンが表示されます。アイコンが点滅するたびに、新しいDeviceContextがSystem.Drawing.Internal.DeviceContexts内部リストに追加されることを発見しました。また、ErrorProviderオブジェクトでDispose()メソッドを呼び出すと、DeviceContextsリストがクリアされません。

結果:デフォルトでは、アイコンは250ミリ秒ごとに点滅するため、1秒あたり4つのDeviceContextオブジェクトがSystem.Drawing.Internal.DeviceContextsリストに追加されます。ErrorProviderがアクティブで、BlinkStyleがAlwaysBlinkの場合、リストは無期限に大きくなります...そしてこのリストが非常に大きい場合(500000以上のオブジェクトで見たことがあります!)、アプリケーションの描画操作は非常に遅くなります:(

このバグは修正済みとしてマークされていますが、最新のコメントによると調査中です。

于 2012-01-11T12:44:17.983 に答える