简体   繁体   English

使用计时器将操作延迟几秒钟

[英]Using Timer to delay an operation a few seconds

I am trying to delay my method by using a timer: 我试图通过使用计时器来延迟我的方法:

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
    }

When i am get into delay() method i want to start the timer, than i want the 5 seconds delay and only after that i want to execute someMethod() and currently this not happen, after execute delay() the someMethod() executed without 5 seconds delay 当我进入delay()方法,我要开始计时,比我想的延时5秒,之后才是我想要执行someMethod()目前这不会发生,后执行的delay()someMethod()执行没有5秒的延迟

Your current code sets up the timer and then immediately executes someMethod . 您当前的代码设置了计时器,然后立即执行someMethod Instead of this, you need to put the actual method call inside your Elapsed handler: 取而代之的是,您需要将实际的方法调用放入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();
}

And if there's nothing else you intend to do you can simply write this inline: 如果您没有打算做的其他事情,则可以直接编写以下内联代码:

_delayTimer = new System.Timers.Timer();
_delayTimer.Interval = 5000;
_delayTimer.Elapsed += (o, e) => someMethod();
_delayTimer.Start();

If you're in .Net4.5(or using BCL.Async pack) you can use Task.Delay 如果您使用的是.Net4.5(或使用BCL.Async包),则可以使用Task.Delay

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

If you're under .Net4.5 如果您使用的是.Net4.5

Try the below code. 试试下面的代码。 I'll suggest you to use System.Threading.Timer 我建议您使用System.Threading.Timer

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

Don't forget when you use Threading.Timer someMethod will be invoked in ThreadPool thread, If you're accessing UI you need to marshal the call to UI thread. 不要忘记在使用Threading.Timer时会在ThreadPool线程中调用someMethod ,如果要访问UI,则需要封送对UI线程的调用。

If you want the current thread to pause for five seconds, then call Thread.Sleep . 如果您希望当前线程暂停五秒钟,请调用Thread.Sleep For example: 例如:

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

Use a timer if you want something to happen five seconds from now, while you're doing something else. 如果您希望从现在起五秒钟后发生其他事情,请使用计时器。 When the timer elapses, the action will be executed on a thread pool thread. 当计时器过去时,该操作将在线程池线程上执行。

Also, if you only want the timer to execute one time (rather than once every five seconds), be sure to set AutoReset to false . 另外,如果只希望计时器执行一次(而不是每五秒钟执行一次),请确保将AutoReset设置为false

You need to call someMethod in the timer's Elapsed handler: 您需要在计时器的Elapsed处理程序中调用someMethod

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();
}

You could also use Task.Delay instead: 您还可以使用Task.Delay代替:

private void delay()
{
    Task.Delay(5000)
    .ContinueWith(t => someMethod());
}
System.Threading.Tasks.Task.Factory.StartNew(() =>
            {
                System.Threading.Thread.Sleep(5000);
                /*
                 * Here Yopur code to do some method :D
                 * */
            });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM