-2

スレッド .timerを作成したクラスがあります。

  System.Threading.Timer timer;
  TimerCallback cb = new TimerCallback(ProcessTimerEvent);
    timer = new Timer(cb, reset, 1000, Convert.ToInt64(this.Interval.TotalSeconds));
}

private void ProcessTimerEvent(object obj)
{
    if (Tick != null)
        Tick(this, EventArgs.Empty);
}

この中にTimerを配置してから、タイマーの作業をしたいです。

私の TickEvent では、メソッドを実行しますが、これをコンパイルしません。

 void MyTimer_Tick(object sender, EventArgs e)
{
 if(value)
   MyFunction();
}

MyFunction が完了するまでタイマーを停止する必要があります。

4

3 に答える 3

0

私はこのコードを使用します。

Enter/Exit を試してください。その場合、タイマーを停止/再起動する必要はありません。重複する呼び出しはロックを取得せず、すぐに戻ります。

object lockObject = new object();

private void ProcessTimerEvent(object state) 
 {
  if (Monitor.TryEnter(lockObject))
  {
   try
   {
   // Work here
   }
   finally
    {
   Monitor.Exit(lockObject);
    }
   }
  }
于 2012-11-07T10:23:37.150 に答える
0

タイマーホルダークラスに name があるとしますMyTimer。必要なのは、イベントの発生を破棄してオフにするメソッドStopを定義することです。Threading.Timer

public class MyTimer
{    
    System.Threading.Timer timer;
    bool enabled;
    TimeSpan interval;
    public event EventHandler Tick;

    public MyTimer(TimeSpan interval)
    {
        enabled = true;
        this.interval = interval;
        timer = new Timer(TimerCallback, null, 1000, (int)interval.TotalSeconds);
    }

    private void TimerCallback(object state)
    {
        if (!enabled)
           return;

        if (Tick != null)
            Tick(this, EventArgs.Empty);          
    }

    public void Stop()
    {
        timer.Dispose();
        timer = null;
        enabled = false;
    }

    public void Start()
    {
        enabled = true;
        timer = new Timer(TimerCallback, null, 1000, (int)interval.TotalSeconds);
    }
}

次に、Tick イベント送信者をタイマー オブジェクトにキャストし、イベントの処理中にタイマーを停止します。処理後、タイマーを再度開始します。

void MyTimer_Tick(object sender, EventArgs e)
{
  MyTimer timer = (MyTimer)sender;
  timer.Stop(); // tick events will not be raised
  if(value)
     MyFunction();

  timer.Start(); // start timer again
}
于 2012-10-31T07:42:18.580 に答える
-1

タイマーを停止するには、Timer.Change メソッドを使用する必要があります

public bool Change(int dueTime, int period)

dueTime Timeout.Infinite を指定して、タイマーが再起動しないようにします。

period 定期的なシグナリングを無効にするには、Timeout.Infinite を指定します。

void MyTimer_Tick(object sender, EventArgs e)
{
    if(value)
    {
        //this stop the timer because dueTime is -1
        _timer.Change(Timeout.Infinite, Timeout.Infinite);
        MyFunction();
        //this start the timer
        _timer.Change(Convert.ToInt64(this.Interval.TotalSeconds), Convert.ToInt64(this.Interval.TotalSeconds));
    }
}

Timeout.Infinite は -1 の定数です

于 2012-10-31T07:56:13.240 に答える