ばかげているように聞こえますが、タイマーを停止するためにすべてを試しましたが、タイマーは停止しません。私はゲームに取り組んでいますが、誰かがタイマーを止める方法を教えていただければ幸いです。
System.Timers.Timer
を使用している場合は、このように停止できます
timer.Enabled = false
System.Threading.Timer
を使用している場合、これを使用します
timer.Change(Timeout.Infinite , Timeout.Infinite)
または使用する
timer.Stop();
System.Windows.Forms.Timer
を使用している場合
そのため、System.Threading.Timerクラスを使用している場合、前の回答に追加するために、これは同じインスタンスを使用する機会がなくなり、永続的に停止します。
timer.Dispose()
そうでなければ:
timer.Change(Timeout.Infinite, Timeout.Infinite)
System.Windows.Forms.Timer:_timer.Enabled = false;
_
System.Threading.Timer:timer.Change(Timeout.Infinite, Timeout.Infinite);
System.Timers.Timer:_timer.Enabled = false;
_またはtimer.Stop();
.NET Frameworkの各タイマーでは、停止する直前にタイマーが起動する可能性があるため、停止後にコールバックが表示されます。
非同期コールバックコンテキスト のようなものを使用する必要があります:タイマーを実行する場合はbool
をtrue
に設定し、false
停止したとき。次に、コールバックでコンテキストをチェックして、実際に実行する必要があるかどうかを確認します。
System.Windows.Forms.Timerを使用していると仮定します。他のものへの明示的な参照がなかったので...もしそうなら...
System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Stop();
タイマーに依存します。スレッドの名前空間からのものである場合は、破棄して必要なときに再作成するか、タイマーデリゲートをリセットイベントで待機させます( msdn を参照)。 System.Timers名前空間には、開始および停止メソッドがあります。
同様の問題に何度も遭遇しました。
_//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
_)チェックがない場合、タスクは再び有効になります。したがって、追加のフラグチェックを追加して、問題を防ぎます。
より明確にするために、コードと追加されたコメントに目を通してください。お役に立てれば。