web-dev-qa-db-ja.com

C#-タイマーを停止するにはどうすればよいですか?

ばかげているように聞こえますが、タイマーを停止するためにすべてを試しましたが、タイマーは停止しません。私はゲームに取り組んでいますが、誰かがタイマーを止める方法を教えていただければ幸いです。

65
di0xide007

System.Timers.Timerを使用している場合は、このように停止できます

timer.Enabled = false

System.Threading.Timerを使用している場合、これを使用します

timer.Change(Timeout.Infinite , Timeout.Infinite)

または使用する

timer.Stop(); 

System.Windows.Forms.Timerを使用している場合

145
Arsen Mkrtchyan

そのため、System.Threading.Timerクラスを使用している場合、前の回答に追加するために、これは同じインスタンスを使用する機会がなくなり、永続的に停止します。

   timer.Dispose()

そうでなければ:

  timer.Change(Timeout.Infinite, Timeout.Infinite)
32
dexter

System.Windows.Forms.Timer:_timer.Enabled = false;_
System.Threading.Timer:timer.Change(Timeout.Infinite, Timeout.Infinite);
System.Timers.Timer:_timer.Enabled = false;_またはtimer.Stop();

21
EricSchaefer

.NET Frameworkの各タイマーでは、停止する直前にタイマーが起動する可能性があるため、停止後にコールバックが表示されます。

非同期コールバックコンテキスト のようなものを使用する必要があります:タイマーを実行する場合はbooltrueに設定し、false停止したとき。次に、コールバックでコンテキストをチェックして、実際に実行する必要があるかどうかを確認します。

6
Stephen Cleary

System.Windows.Forms.Timerを使用していると仮定します。他のものへの明示的な参照がなかったので...もしそうなら...

System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Stop(); 
1
Aaron McIver

タイマーに依存します。スレッドの名前空間からのものである場合は、破棄して必要なときに再作成するか、タイマーデリゲートをリセットイベントで待機させます( msdn を参照)。 System.Timers名前空間には、開始および停止メソッドがあります。

1
Kell

同様の問題に何度も遭遇しました。

_//Timer init.
 var _timer = new System.Timers.Timer
{
    AutoReset = true, 
    Enabled = true,
    Interval = TimeSpan.FromSeconds(15).TotalMilliseconds //15 seconds interval
};
 _timer.Elapsed += DoSomethingOnTimerElapsed;


//To be called on timer elapsed.
private void DoSomethingOnTimerElapsed(object source, ElapsedEventArgs e)
{
    //Disable timer.
    _timer.Enabled = false; //or _timer.Stop()
    try
    {
        //does long running process
    }
    catch (Exception ex)
    {

    }
    finally
    {
        if (_shouldEnableTimer) //set its default value to true.
            _timer.Enabled = true; //or _timer.Start()
    }
}


//somewhere in the code if you want to stop timer:
_timer.Enabled = _shouldEnableTimer = false;

//At any point, if you want to resume timer add this:
_timer.Enabled = _shouldEnableTimer = true;
_

なぜそうするのですか?

Tryブロック内のコードにはもっと時間がかかると仮定しましょう。したがって、タイマー(_timer.Enabled = false or _timer.Stop())を無効にするまでに、tryブロック内のコードがまだ実行されている可能性が高くなります。したがって、タスクの完了後、最終的にはflag(__shouldEnableTimer_)チェックがない場合、タスクは再び有効になります。したがって、追加のフラグチェックを追加して、問題を防ぎます。

より明確にするために、コードと追加されたコメントに目を通してください。お役に立てれば。

1
Avi-B