mrb*_*oks 9 .net c# timer timertask
如何从此计时器的回调函数更改System.Threading.Timer中的间隔?它是否正确?
这样做.没有发生.
public class TestTimer
{
private static Timer _timer = new Timer(TimerCallBack);
public void Run()
{
_timer.Change(TimeSpan.Zero, TimeSpan.FromMinutes(1));
}
private static void TimerCallBack(object obj)
{
if(true)
_timer.Change(TimeSpan.Zero, TimeSpan.FromMinutes(10));
}
}
Run Code Online (Sandbox Code Playgroud)
Ale*_*Aza 11
此行生成无限递归:
if(true)
_timer.Change(TimeSpan.Zero, TimeSpan.FromMinutes(10));
Run Code Online (Sandbox Code Playgroud)
第一个参数强制TimerCallBack立即执行.所以它无限期地一次又一次地执行它.
修复将是
if(true)
_timer.Change(TimeSpan.FromMinutes(10), TimeSpan.FromMinutes(10));
Run Code Online (Sandbox Code Playgroud)
问题是您的呼叫Change指定下一个呼叫应立即发生。如果您要Change 每次通话,您都可以使用一个句号Timeout.Infinite(仅是-1的常数)来告诉它避免下次再重复一次-但它仍然会触发,因为下一次时间,您将其重置。例如:
using System;
using System.Threading;
static class Program
{
private static Timer timer = new Timer(TimerCallBack);
public static void Main()
{
timer.Change(TimeSpan.Zero, TimeSpan.FromSeconds(1));
Thread.Sleep(10000);
}
private static void TimerCallBack(object obj)
{
Console.WriteLine("{0}: Fired", DateTime.Now);
timer.Change(TimeSpan.FromSeconds(3),
TimeSpan.FromMilliseconds(Timeout.Infinite));
}
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以只更改一次,然后将其保留:
using System;
using System.Threading;
static class Program
{
private static Timer timer = new Timer(TimerCallBack);
private static bool changed = false;
public static void Main()
{
timer.Change(TimeSpan.Zero, TimeSpan.FromSeconds(1));
Thread.Sleep(10000);
}
private static void TimerCallBack(object obj)
{
Console.WriteLine("{0}: Fired", DateTime.Now);
if (!changed)
{
changed = true;
TimeSpan interval = TimeSpan.FromSeconds(3);
timer.Change(interval, interval);
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,在任何一种情况下,都没有使用初始间隔(上述示例中为1秒),因为我们会Change立即调用-如果您确实希望在第一次调用之前有其他时间,请不要TimeSpan.Zero在的初始调用中使用Change。
| 归档时间: |
|
| 查看次数: |
15493 次 |
| 最近记录: |