每 x 分钟调用一个方法

我想每5分钟调用一个方法,我该怎么做呢?

public class Program
{
static void Main(string[] args)
{
Console.WriteLine("*** calling MyMethod *** ");
Console.ReadLine();
}


private MyMethod()
{
Console.WriteLine("*** Method is executed at {0} ***", DateTime.Now);
Console.ReadLine();
}
}
225706 次浏览

使用 Timer.定时器文档

while (true)
{
Thread.Sleep(60 * 5 * 1000);
Console.WriteLine("*** calling MyMethod *** ");
MyMethod();
}
var startTimeSpan = TimeSpan.Zero;
var periodTimeSpan = TimeSpan.FromMinutes(5);


var timer = new System.Threading.Timer((e) =>
{
MyMethod();
}, null, startTimeSpan, periodTimeSpan);

编辑-这个答案是过时的。见 https://stackoverflow.com/a/70887955/426894

我是根据“ asawyer”的回答得出这个结论的。他似乎没有编译错误,但我们中的一些人有。下面是 VisualStudio2010中的 C # 编译器将接受的版本。

var timer = new System.Threading.Timer(
e => MyMethod(),
null,
TimeSpan.Zero,
TimeSpan.FromMinutes(5));

使用 Timer的例子:

using System;
using System.Timers;


static void Main(string[] args)
{
Timer t = new Timer(TimeSpan.FromMinutes(5).TotalMilliseconds); // Set the time (5 mins in this case)
t.AutoReset = true;
t.Elapsed += new System.Timers.ElapsedEventHandler(your_method);
t.Start();
}


// This method is called every 5 mins
private static void your_method(object sender, ElapsedEventArgs e)
{
Console.WriteLine("...");
}

在类的构造函数中启动计时器。 间隔以毫秒为单位,因此5 * 60秒 = 300秒 = 300000毫秒。

static void Main(string[] args)
{
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 300000;
timer.Elapsed += timer_Elapsed;
timer.Start();
}

然后在 timer_Elapsed事件中调用 GetData(),如下所示:

static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//YourCode
}

我已经上传了一个 Nuget 软件包,可以使它如此简单,你可以有它从这里 行动计划程序

它支持.NET Standard 2.0

以及如何开始使用它

using ActionScheduler;


var jobScheduler = new JobScheduler(TimeSpan.FromMinutes(8), new Action(() => {
//What you want to execute
}));


jobScheduler.Start(); // To Start up the Scheduler


jobScheduler.Stop(); // To Stop Scheduler from Running.

使用 DispatcherTimer:

 var _activeTimer = new DispatcherTimer {
Interval = TimeSpan.FromMinutes(5)
};
_activeTimer.Tick += delegate (object sender, EventArgs e) {
YourMethod();
};
_activeTimer.Start();

如果需要更复杂的时间执行,比如 linux cron,可以使用 NCrontab。

我使用 NCrontab 在生产很长一段时间,它的工作完美!

Nuget

使用方法:

* * * * *
- - - - -
| | | | |
| | | | +----- day of week (0 - 6) (Sunday=0)
| | | +------- month (1 - 12)
| | +--------- day of month (1 - 31)
| +----------- hour (0 - 23)
+------------- min (0 - 59)
using NCrontab;
//...


protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
// run every 5 minutes
var schedule = CrontabSchedule.Parse("*/5 * * * *");
var nextRun = schedule.GetNextOccurrence(DateTime.Now);
logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
do
{
if (DateTime.Now > nextRun)
{
logger.LogInformation("Sending notifications at: {time}", DateTimeOffset.Now);
await DoSomethingAsync();
nextRun = schedule.GetNextOccurrence(DateTime.Now);
}
await Task.Delay(1000, stoppingToken);
} while (!stoppingToken.IsCancellationRequested);
}

如果需要,可以增加几秒钟:

// run every 10 secs
var schedule = CrontabSchedule.Parse("0/10 * * * * *", new CrontabSchedule.ParseOptions { IncludingSeconds = true });

更新.NET 6

对于 dotnet 6 + 中的大多数用例,您应该使用 PeriodicTimer:

var timer = new PeriodicTimer(TimeSpan.FromSeconds(10));


while (await timer.WaitForNextTickAsync())
{
//Business logic
}

这有几个优点,包括异步/等待支持、避免回调的内存泄漏以及 CancelationToken支持

进一步阅读

可以通过应用 while 循环并在循环结束时调用 Thread.Sleep来实现。

while (true)
{
//Your code
Thread.Sleep(5000);
}

确保包括 using System.Threading