Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用计时器将操作延迟几秒钟_C#_Timer - Fatal编程技术网

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

C# 使用计时器将操作延迟几秒钟,c#,timer,C#,Timer,我试图使用计时器延迟我的方法: private System.Timers.Timer _delayTimer; private void delay() { _delayTimer = new System.Timers.Timer(); _delayTimer.Interval = 5000; //_delayTimer.Enabled = true; _delayTimer.Elapsed +

我试图使用计时器延迟我的方法:

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秒延迟

您当前的代码设置计时器,然后立即执行
somethod
。与此相反,您需要将实际的方法调用放入
appeased
处理程序中:

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

您需要在计时器的已用处理程序中调用
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();
}
您也可以使用
Task.Delay

private void delay()
{
    Task.Delay(5000)
    .ContinueWith(t => someMethod());
}
如果您在.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);\

使用线程时不要忘记。Timer
someMethod
将在
ThreadPool
线程中调用,如果您正在访问UI,则需要封送对UI线程的调用。

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

Thread.Sleep(TimeSpan.FromSeconds(5));
DoSomething();
如果你想从现在起五秒钟内发生什么事情,而你正在做其他事情,请使用计时器。当计时器过期时,该操作将在线程池线程上执行


此外,如果您只希望计时器执行一次(而不是每五秒钟执行一次),请确保将设置为
false

,这可能值得注意,如果
someMethod
访问任何UI组件,则会发生非法的跨线程调用。为了解决此问题,您可以将
TaskScheduler.FromCurrentSynchronizationContext()
的结果作为第二个参数传递给
ContinueWith
方法。如果someMethod()接收到一个对象作为参数,并且我正在使用Timer.Tag属性将此对象发送给_delayTimer\u,如何将此对象从_delayTimer_appeased中强制转换?@user2214609:将第一个参数(
sender
长格式,
o
短格式)强制转换为
Timer
,并访问其
标记,例如
(o,e)=>someMethod(((Timer)o).Tag
。实际上,在简短的形式中,您还可以直接捕获参数:
(o,e)=>someMethod(\u delayTimer.Tag)
。我可以举一个简短的例子吗?这样很难理解(我是一名新开发人员…),我将相关代码移到了_delayTimer_expased中,并希望将MyObject作为parameter@user2214609:
var timer=(timer)发送方
然后访问
timer.Tag
。我正在使用System.Timers.timer\u delayTimer,MyObject object object=(timer)之后,发送方出现错误:无法隐式将类型“System.Threading.timer”转换为“我的命名空间”
System.Threading.Tasks.Task.Factory.StartNew(() =>
            {
                System.Threading.Thread.Sleep(5000);
                /*
                 * Here Yopur code to do some method :D
                 * */
            });