0

複数のタイマーを含む Forms アプリケーションがあり、すべてが異なる時間にタスクを実行していますが、「あまり良くない」コンピューターでアプリケーションに問題が発生し始めました。私の問題は、GUI が必要な時間を取得していないことです。非常にマイナーなタスクで単純なボタンをクリックするだけでも、非常に長い時間がかかる場合があります。そして「押し」そのものが遅れている気がします。さて、私の質問ですが、タイマーよりも GUI を優先する方法はありますか? たとえば、GUI が機能する必要がある場合は、目盛りをスキップしますか? (いつかスキップできないほど重要なタイマーはありません)。または、常に GUI を機能させる別の方法はありますか? ところで、私が使用しSystem.Timers.Timerているのは、System.Windows.Forms.Timer よりも正しい選択です。

4

4 に答える 4

1

スレッドを使用する

タイマーを邪魔しない新しい(別の)スレッドを作成すると、タスクが同時に完了します。

ただし、複雑なデータを処理している場合は、すべてのスレッドが終了するのを待ってから先に進みます!!

これが役立つことを願っています:)

于 2013-03-07T06:25:10.120 に答える
1

System.Windows.Forms.TimerWinForms を使用している場合は、を使用する必要があります。

このタイマーは、Windows フォーム アプリケーションでの使用に最適化されており、ウィンドウで使用する必要があります。

アプリケーションに 1 つまたは 100 のタイマーがあるかどうかは、実際には問題ではありません。Tick重要なのは、タイマー コールバック (ハンドラー)で何をしているかです。「わずかな」時間以上かかるコードは、UI に「遅い」感じを引き起こします。

すべてのタイマーが何をしているかを詳しく説明し、コードを投稿していただければ、さらにアドバイスを提供できます。

于 2013-03-07T06:21:28.467 に答える
1

それらの「あまり良くない」コンピューターには、タスクを短時間で処理するのに十分なリソースがありません。したがって、マルチスレッドが必要です。

思ったほど難しくはありません。チュートリアルを読むだけで出来上がりです。

于 2013-03-07T06:25:56.173 に答える
0

タイマー イベントで時間のかかるタスクを開始する場合は、別のスレッドで実行することをお勧めします。最短/最も簡単な方法は次のようなものです。

ThreadPool.QueueUserWorkItem((o) => { 
    // Do lenghty stuff
    // ...
    BeginInvoke((MethodInvoker)delegate() {
       // Update UI, if necessary
    });
});

私はSystem.Timers.Timer個人的に大ファンではありません。System.Threading.Timerタスクが長いか非 GUI で、System.Windows.Forms.TimerGUI の更新が短い場合 (GUI スレッドで起動するため、何もする必要はありません)を好みますInvoke

厳密に定期的なタイマーでタスクを開始する際の問題の1つは、以前に開始したタスクがまだ完了していない場合でも(停止/開始などしない限り)、起動して起動し、起動することです。は、一度発火させて、タスクを開始して完了させた後、再度発火さSystem.Threading.Timerせることができるので便利です。

finally {
    new System.Threading.Timer((o) => { ... }, null, 60000, 0);
}
于 2013-03-07T07:50:23.480 に答える