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()没有someMethod()5 秒的延迟

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 回答
6

如果您使用的是 .Net4.5(或使用 BCL.Async 包),您可以使用Task.Delay

private async void delay()
{
    await Task.Delay(5000);
    someMethod();
}

如果您在 .Net4.5 下

试试下面的代码。我会建议你使用System.Threading.Timer

var timer = new System.Threading.Timer(x => someMethod(), null, 5000, System.Threading.Timeout.Infinite);\

不要忘记使用 Threading.TimersomeMethod时将在ThreadPool线程中调用,如果您正在访问 UI,则需要编组对 UI 线程的调用。

于 2013-10-15T18:36:27.263 回答
5

如果您希望当前线程暂停五秒钟,请调用Thread.Sleep. 例如:

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

如果您希望在五秒钟后发生某件事,而您正在做其他事情,请使用计时器。当计时器结束时,该操作将在线程池线程上执行。

此外,如果您只希望计时器执行一次(而不是每五秒执行一次),请务必将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 回答