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
* */
});