Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.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# System.Threading.Timer。。。下次火灾的时间?_C#_Multithreading_Timer - Fatal编程技术网

C# System.Threading.Timer。。。下次火灾的时间?

C# System.Threading.Timer。。。下次火灾的时间?,c#,multithreading,timer,C#,Multithreading,Timer,我有一个关于计时器的问题。间隔时间是否计算回调执行的时间?我的意思是,例如,我有一个计时器设置为每15秒启动一次,它执行一个回调函数,持续时间大约为3秒。下一次计时器什么时候启动?在18秒内(回调完成后)或15秒内(不等待回调)??? 提前感谢无论回调执行时间如何,它都将每15秒触发一次。如果希望包含回调执行时间,可以按如下方式暂停并重新启动回调中的计时器 一开始: someTimer.Change(Timeout.Infinite,Timeout.Infinite) 。。最后,使用相同的方法将

我有一个关于计时器的问题。间隔时间是否计算回调执行的时间?我的意思是,例如,我有一个计时器设置为每15秒启动一次,它执行一个回调函数,持续时间大约为3秒。下一次计时器什么时候启动?在18秒内(回调完成后)或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秒触发一次。如果希望包含回调执行时间,可以按如下方式暂停并重新启动回调中的计时器

一开始:

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秒触发,因此回调将在另一个线程中执行?是的,一个线程池线程。在文件里<