複数のタイマーを含む Forms アプリケーションがあり、すべてが異なる時間にタスクを実行していますが、「あまり良くない」コンピューターでアプリケーションに問題が発生し始めました。私の問題は、GUI が必要な時間を取得していないことです。非常にマイナーなタスクで単純なボタンをクリックするだけでも、非常に長い時間がかかる場合があります。そして「押し」そのものが遅れている気がします。さて、私の質問ですが、タイマーよりも GUI を優先する方法はありますか? たとえば、GUI が機能する必要がある場合は、目盛りをスキップしますか? (いつかスキップできないほど重要なタイマーはありません)。または、常に GUI を機能させる別の方法はありますか? ところで、私が使用しSystem.Timers.Timer
ているのは、System.Windows.Forms.Timer よりも正しい選択です。
4 に答える
スレッドを使用する
タイマーを邪魔しない新しい(別の)スレッドを作成すると、タスクが同時に完了します。
ただし、複雑なデータを処理している場合は、すべてのスレッドが終了するのを待ってから先に進みます!!
これが役立つことを願っています:)
System.Windows.Forms.Timer
WinForms を使用している場合は、を使用する必要があります。
このタイマーは、Windows フォーム アプリケーションでの使用に最適化されており、ウィンドウで使用する必要があります。
アプリケーションに 1 つまたは 100 のタイマーがあるかどうかは、実際には問題ではありません。Tick
重要なのは、タイマー コールバック (ハンドラー)で何をしているかです。「わずかな」時間以上かかるコードは、UI に「遅い」感じを引き起こします。
すべてのタイマーが何をしているかを詳しく説明し、コードを投稿していただければ、さらにアドバイスを提供できます。
それらの「あまり良くない」コンピューターには、タスクを短時間で処理するのに十分なリソースがありません。したがって、マルチスレッドが必要です。
思ったほど難しくはありません。チュートリアルを読むだけで出来上がりです。
タイマー イベントで時間のかかるタスクを開始する場合は、別のスレッドで実行することをお勧めします。最短/最も簡単な方法は次のようなものです。
ThreadPool.QueueUserWorkItem((o) => {
// Do lenghty stuff
// ...
BeginInvoke((MethodInvoker)delegate() {
// Update UI, if necessary
});
});
私はSystem.Timers.Timer
個人的に大ファンではありません。System.Threading.Timer
タスクが長いか非 GUI で、System.Windows.Forms.Timer
GUI の更新が短い場合 (GUI スレッドで起動するため、何もする必要はありません)を好みますInvoke
。
厳密に定期的なタイマーでタスクを開始する際の問題の1つは、以前に開始したタスクがまだ完了していない場合でも(停止/開始などしない限り)、起動して起動し、起動することです。は、一度発火させて、タスクを開始して完了させた後、再度発火さSystem.Threading.Timer
せることができるので便利です。
finally {
new System.Threading.Timer((o) => { ... }, null, 60000, 0);
}