0

毎秒タイマーを実行したい。しかし、フリーズを防ぐために、UI スレッドで実行したくありません。

そのため、デザイナーが提供する組み込みのタイマーとは別のタイマーを使用しています。そして、これが正しいアプローチであるかどうかはよくわかりません。

  threadtimer = new System.Threading.Timer(timer, null, 1000, Timeout.Infinite);
        private void timer(object obj)
        {
            dowork.....

            threadtimer.Change(1000, Timeout.Infinite);
        }

それは間違っているようです。最初にスレッドを作成し、1000 後に無限に実行するように指示します。それでも、それを永遠に行うには、もう一度言い直さなければなりません。2 番目の引数が成り立たないのに、どうして 2 番目の引数があるのでしょうか?

4

1 に答える 1

5

そのようにする必要はありませ。3 番目の引数 (dueTime = 1000) は、タイマーが最初に呼び出されるまでの遅延です。4 番目 (期間 = 無限大) は、定期的な性質、つまりコールバックを生成する時間ではなく、後続のコールバックが実行される頻度を制御します。

この方法では、現在のタイマーが終了してから次のタイマーが開始されるまでに 1 秒の遅延が発生します。

毎秒発生させたい場合は、両方の引数に 1000 を指定するだけでよく、コールバック内からタイマーを再起動する必要はありません。

1 秒以上かかる場合、複数のコールバックが発生する可能性がありますが、コールバックが十分に高速であると仮定すると、問題にはなりません。

基本的に、arg3タイマーを作成してから最初のコールバックはミリ秒になり、その後はarg4ミリ秒ごとになります。詳細については、コンストラクターについてはこちらメソッドChangeについてはこちらをご覧ください。

于 2013-08-31T09:05:06.807 に答える