3

タイマーを使用してメソッドを遅らせようとしています:

private System.Timers.Timer _delayTimer;

    private void delay()
    {
          _delayTimer = new System.Timers.Timer();
          _delayTimer.Interval = 5000;
          //_delayTimer.Enabled = true;
          _delayTimer.Elapsed += _delayTimer_Elapsed;
          _delayTimer.Start();
          someMethod();
        }
    }

    private void _delayTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        // delay for 5 seconds
    }

メソッドに入るときdelay()、タイマーを開始したいのですが、5秒の遅延が必要であり、その後のみ実行someMethod()したいのですが、現在これは発生しません。実行後、delay()5someMethod()秒の遅延なしで実行されます

4

5 に答える 5

12

現在のコードはタイマーを設定し、すぐに実行しsomeMethodます。Elapsedこれの代わりに、実際のメソッド呼び出しをハンドラー内に配置する必要があります。

private void delay()
{
      _delayTimer = new System.Timers.Timer();
      _delayTimer.Interval = 5000;
      //_delayTimer.Enabled = true;
      _delayTimer.Elapsed += _delayTimer_Elapsed;
      _delayTimer.Start();
    }
}

private void _delayTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
      someMethod();
}

他に何もするつもりがない場合は、次のようにインラインで記述できます。

_delayTimer = new System.Timers.Timer();
_delayTimer.Interval = 5000;
_delayTimer.Elapsed += (o, e) => someMethod();
_delayTimer.Start();
于 2013-10-15T18:35:48.983 に答える
5

現在のスレッドを 5 秒間一時停止する場合は、 を呼び出しますThread.Sleep。例えば:

Thread.Sleep(TimeSpan.FromSeconds(5));
DoSomething();

何か他のことをしている間に、今から 5 秒後に何かを実行したい場合は、タイマーを使用します。タイマーが経過すると、アクションはスレッド プール スレッドで実行されます。

また、タイマーを (5 秒に 1 回ではなく) 1 回だけ実行する場合は、必ずAutoResetをに設定してfalseください。

于 2013-10-15T19:26:14.950 に答える
2

someMethodタイマーの Elapsed ハンドラーを呼び出す必要があります。

private void delay()
{
      _delayTimer = new System.Timers.Timer();
      _delayTimer.Interval = 5000;
      _delayTimer.AutoReset = false; //so that it only calls the method once
      _delayTimer.Elapsed += (s,args) => someMethod();
      _delayTimer.Start();
}

Task.Delay代わりに次を使用することもできます。

private void delay()
{
    Task.Delay(5000)
    .ContinueWith(t => someMethod());
}
于 2013-10-15T18:35:53.710 に答える
2
System.Threading.Tasks.Task.Factory.StartNew(() =>
            {
                System.Threading.Thread.Sleep(5000);
                /*
                 * Here Yopur code to do some method :D
                 * */
            });
于 2013-10-15T20:17:07.730 に答える