System.Windows.Forms.Timer に基づいて頻繁に更新される多くのユーザー コントロールを含むアプリケーションがあります。各コントロールのパフォーマンスにタイマー インスタンスを追加しても安全ですか? または、すべてのインスタンスで使用される常に実行されるシングルトン タイマーを 1 つ持つ必要がありますか? ボンネットの下で実際に何が起こっているのですか?タイマーごとに (カウント用の) 追加のスレッドはありますか?
3 に答える
System.Windows.Forms.Timer
古き良き User32 Timersを介して実装されます。そのため、操作に別のスレッドを使用したり、必要としたりしません。とはいえ、無限の数を持つことはできないという点で、それらは有限のリソースです。
タイマーを使用した多数のユーザー コントロールがあると言うとき、「多数」とはどういう意味ですか? 10? 10000?
頻繁に更新されるとはどういう意味ですか? 毎分?100ミリ秒ごと?彼らのタイマーが起動できるのと同じくらい速く?
アプリのストレス テストを行います。クラッシュし始めるか、使用できなくなるほど遅くなる前に、いくつのコントロールをアクティブにできるかを確認してください。おそらく、メッセージの内部処理のオーバーヘッドが原因でWM_TIMER
、他のリソースが使い果たされるずっと前にパフォーマンスが低下するポイントに到達する可能性があります。
追加スレッドはありません。スレッドのメッセージ キューに大量の WM_TIMER メッセージが入っています。したがって、これらのタイマーは、タイムスパンが重複していても、コードを並行して実行しません。
コントロールごとに別のタイマーを用意しても問題ないと思います。少なくとも、単一のタイマーを使用する場合と比べて、測定可能なパフォーマンスの違いは絶対にありません。ただし、コードはより読みやすくなります。;)
ところで、今日では複数の CPU コアへの大規模な移行が行われているため、これがそのメリットを享受できる場所ではないかどうかを検討してください。
タイマーは、コントロールごとに異なる時間に起動しますか? それぞれに別のタイマーが必要ですか?
複数のイベント ハンドラーを 1 つのイベントに接続できることを覚えておいてください。そのため、タイマーを使用して単純なアニメーションを実行している場合、多くのコントロールに対して 1 つのタイマーでイベントを発生させることで、おそらくそれを行うことができます...