私はタイマーの再アクティブ化をワーカースレッドに保つために '一時停止'ラッチを設定できるTimerの派生クラスを作成しようとしました。ただし、AutoResetがfalseに設定されているときにElapsedイベントが引き続き発生し、Paused変数が設定された後でEnabledアクセサがその基本クラスのEnabledプロパティを変更できないように見えます。Enabledがfalseに設定されていると、なぜSystem.Timer.Timerでイベントが発生するのですか?
ここで実際に起こっている相互作用をさらに理解するために、なぜこれが起こっているのですか。
以下の派生クラスの実装を添付しました。
using System.Timers
class PauseableTimer : Timer
{
public bool Paused;
new public bool Enabled
{
get
{
return base.Enabled;
}
set
{
if (Paused)
{
if (!value) base.Enabled = false;
}
else
{
base.Enabled = value;
}
}
}
}
問題の例を示します。
class Program
{
private static PauseableTimer _pauseableTimer;
private static int _elapsedCount;
static void Main(string[] args)
{
_pauseableTimer = new PauseableTimer(){AutoReset = false,Enabled = false,Paused = false};
_pauseableTimer.Elapsed += pauseableTimer_Elapsed;
_pauseableTimer.Interval = 1;
_pauseableTimer.Enabled = true;
while(_elapsedCount<100)
{
if (_elapsedCount > 50) _pauseableTimer.Paused = true;
}
}
static void pauseableTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Console.WriteLine(String.Format("this.Enabled:'{0}',Paused:'{1}',AutoReset:'{2}",_pauseableTimer.Enabled,_pauseableTimer.Paused,_pauseableTimer.AutoReset));
_elapsedCount++;
_pauseableTimer.Interval = _pauseableTimer.Interval == 1 ? 2 : 1; //This line breaks it.
_pauseableTimer.Enabled = true;
}
}
私が見ている問題はまさに問題です。ボトムライン:インターバルを設定しないでください。タイマーが起動します。 –