C# System.Threading.Timer。。。下次火灾的时间?
我有一个关于计时器的问题。间隔时间是否计算回调执行的时间?我的意思是,例如,我有一个计时器设置为每15秒启动一次,它执行一个回调函数,持续时间大约为3秒。下一次计时器什么时候启动?在18秒内(回调完成后)或15秒内(不等待回调)???C# System.Threading.Timer。。。下次火灾的时间?,c#,multithreading,timer,C#,Multithreading,Timer,我有一个关于计时器的问题。间隔时间是否计算回调执行的时间?我的意思是,例如,我有一个计时器设置为每15秒启动一次,它执行一个回调函数,持续时间大约为3秒。下一次计时器什么时候启动?在18秒内(回调完成后)或15秒内(不等待回调)??? 提前感谢无论回调执行时间如何,它都将每15秒触发一次。如果希望包含回调执行时间,可以按如下方式暂停并重新启动回调中的计时器 一开始: someTimer.Change(Timeout.Infinite,Timeout.Infinite) 。。最后,使用相同的方法将
提前感谢无论回调执行时间如何,它都将每15秒触发一次。如果希望包含回调执行时间,可以按如下方式暂停并重新启动回调中的计时器 一开始:
someTimer.Change(Timeout.Infinite,Timeout.Infinite)
。。最后,使用相同的方法将其更改回:
someTimer.Change(TimeSpan.FromSeconds(15),TimeSpan.FromSeconds(15))
无论回调执行时间如何,它都将每隔15秒触发一次。如果希望包含回调执行时间,可以按如下方式暂停并重新启动回调中的计时器
一开始:
someTimer.Change(Timeout.Infinite,Timeout.Infinite)
。。最后,使用相同的方法将其更改回:
someTimer.Change(TimeSpan.FromSeconds(15),TimeSpan.FromSeconds(15))
无论回调执行时间如何,它都将每隔15秒触发一次。如果希望包含回调执行时间,可以按如下方式暂停并重新启动回调中的计时器
一开始:
someTimer.Change(Timeout.Infinite,Timeout.Infinite)
。。最后,使用相同的方法将其更改回:
someTimer.Change(TimeSpan.FromSeconds(15),TimeSpan.FromSeconds(15))
无论回调执行时间如何,它都将每隔15秒触发一次。如果希望包含回调执行时间,可以按如下方式暂停并重新启动回调中的计时器
一开始:
someTimer.Change(Timeout.Infinite,Timeout.Infinite)
。。最后,使用相同的方法将其更改回:
someTimer.Change(TimeSpan.FromSeconds(15),TimeSpan.FromSeconds(15))
它将每隔15秒触发一次。回调的任何延迟都不会影响计时器。回调在单独的线程池线程上执行。从
该方法不会在创建计时器的线程上执行;它在系统提供的线程池线程上执行
如果要将处理时间考虑在内,您必须自己管理计时器-启动单个fire计时器并从回调内部重置它,例如:
TimerCallback tcb = MyCallBack;
//Start the timer once after 15 secs
_timer=new Timer(tcb,null,TimeSpan.FromSeconds(15),TimeSpan.Infinite);
...
void MyCallBack(Object stateInfo)
{
....
//Reset the timer
_timer.Change(TimeSpan.FromSeconds(15),TimeSpan.Infinite);
}
一种更简单、更简洁的方法是使用async/await
在每次异步执行后等待X秒。例如,以下代码将在方法上次执行15秒后执行该方法:
while(...)
{
await Task.Delay(TimeSpan.FromSeconds(15));
var response=await Task.Run(()=>someMethod());
...
}
或者,如果您想要执行已经是异步的代码
while(...)
{
await Task.Delay(TimeSpan.FromSeconds(15));
await myHttpClient.GetStringAsync(someURL);
}
在引擎盖下,
Task.Delay
创建一个火灾计时器,并在计时器完成时完成。这几乎与手动操作相同 每15秒发射一次。回调的任何延迟都不会影响计时器。回调在单独的线程池线程上执行。从
该方法不会在创建计时器的线程上执行;它在系统提供的线程池线程上执行
如果要将处理时间考虑在内,您必须自己管理计时器-启动单个fire计时器并从回调内部重置它,例如:
TimerCallback tcb = MyCallBack;
//Start the timer once after 15 secs
_timer=new Timer(tcb,null,TimeSpan.FromSeconds(15),TimeSpan.Infinite);
...
void MyCallBack(Object stateInfo)
{
....
//Reset the timer
_timer.Change(TimeSpan.FromSeconds(15),TimeSpan.Infinite);
}
一种更简单、更简洁的方法是使用async/await
在每次异步执行后等待X秒。例如,以下代码将在方法上次执行15秒后执行该方法:
while(...)
{
await Task.Delay(TimeSpan.FromSeconds(15));
var response=await Task.Run(()=>someMethod());
...
}
或者,如果您想要执行已经是异步的代码
while(...)
{
await Task.Delay(TimeSpan.FromSeconds(15));
await myHttpClient.GetStringAsync(someURL);
}
在引擎盖下,
Task.Delay
创建一个火灾计时器,并在计时器完成时完成。这几乎与手动操作相同 每15秒发射一次。回调的任何延迟都不会影响计时器。回调在单独的线程池线程上执行。从
该方法不会在创建计时器的线程上执行;它在系统提供的线程池线程上执行
如果要将处理时间考虑在内,您必须自己管理计时器-启动单个fire计时器并从回调内部重置它,例如:
TimerCallback tcb = MyCallBack;
//Start the timer once after 15 secs
_timer=new Timer(tcb,null,TimeSpan.FromSeconds(15),TimeSpan.Infinite);
...
void MyCallBack(Object stateInfo)
{
....
//Reset the timer
_timer.Change(TimeSpan.FromSeconds(15),TimeSpan.Infinite);
}
一种更简单、更简洁的方法是使用async/await
在每次异步执行后等待X秒。例如,以下代码将在方法上次执行15秒后执行该方法:
while(...)
{
await Task.Delay(TimeSpan.FromSeconds(15));
var response=await Task.Run(()=>someMethod());
...
}
或者,如果您想要执行已经是异步的代码
while(...)
{
await Task.Delay(TimeSpan.FromSeconds(15));
await myHttpClient.GetStringAsync(someURL);
}
在引擎盖下,
Task.Delay
创建一个火灾计时器,并在计时器完成时完成。这几乎与手动操作相同 每15秒发射一次。回调的任何延迟都不会影响计时器。回调在单独的线程池线程上执行。从
该方法不会在创建计时器的线程上执行;它在系统提供的线程池线程上执行
如果要将处理时间考虑在内,您必须自己管理计时器-启动单个fire计时器并从回调内部重置它,例如:
TimerCallback tcb = MyCallBack;
//Start the timer once after 15 secs
_timer=new Timer(tcb,null,TimeSpan.FromSeconds(15),TimeSpan.Infinite);
...
void MyCallBack(Object stateInfo)
{
....
//Reset the timer
_timer.Change(TimeSpan.FromSeconds(15),TimeSpan.Infinite);
}
一种更简单、更简洁的方法是使用async/await
在每次异步执行后等待X秒。例如,以下代码将在方法上次执行15秒后执行该方法:
while(...)
{
await Task.Delay(TimeSpan.FromSeconds(15));
var response=await Task.Run(()=>someMethod());
...
}
或者,如果您想要执行已经是异步的代码
while(...)
{
await Task.Delay(TimeSpan.FromSeconds(15));
await myHttpClient.GetStringAsync(someURL);
}
在引擎盖下,
Task.Delay
创建一个火灾计时器,并在计时器完成时完成。这几乎与手动操作相同 计时器与其回调无关。它将在15秒触发,因此回调将在另一个线程中执行?是的,一个线程池线程。在文件里<