我正在设置下载内容的小时数,并将其与当前时间进行比较以完成我的任务。例如,如果我将任务设置为48小时,那么我将其与当前时间进行比较并获得预期结果。在这种情况下,在完成48小时后,我正在调用另一种方法。
这是我的代码:
if (_ScheduledTweetCount > 0 || DateTime.Now <= _ScheduledTweetHourTxtBox)
{
if (_ScheduledTweetCount > 0)
{
_ScheduledTweetCount--;
}
else
{
_ScheduledTweetHourTxtBox.CompareTo(scheduledTweetHourTxtBox);
}
sw.Close();
sw.Dispose();
}
CallingAnotherMethod();
我想要实现的是,而不是等待48小时来调用CallingAnotherMethod();
方法,我想每小时调用一次,直到达到我预定的时间。我看到一些文章相关的计时器,但我不确定在这种情况下如何使用它。
答案 0 :(得分:2)
有两种方法可以做到这一点。一种是使用从第一次调用时起每60分钟运行一次的计时器。第二种方法是创建一个在后台运行的计时器,每10秒左右调用一次,以检查是否已经过了一个小时(例如,如果时间从2.55变为3.10)。
60分钟计时器
myTimer = new System.Timers.Timer(60 * 60 * 1000); //one hour in milliseconds
myTimer.Elapsed += new ElapsedEventHandler(everyHour);
myTimer.Start();
事件处理程序方法:
private static void everyHour(object src, ElapsedEventArgs e)
{
// Put the code you want repeated in here
}
检查时间是否按小时值更改
myTimer = new System.Timers.Timer(1000); //One second, (less of an interval means that it will be more accurate, but more of an interval will mean that it uses less resources.
int previousHour = DateTime.Now.Hour;
myTimer.Elapsed += new ElapsedEventHandler(everyHour);
myTimer.Start();
事件处理程序方法:
private static void everyHour(object src, ElapsedEventArgs e)
{
if(previousHour < DateTime.Now.Hour || (previousHour == 23 && DateTime.Now.Hour == 0))
{
previousHour = DateTime.Now.Hour;
YourMethod(); // Call The method with your important staff..
}
}
答案 1 :(得分:0)
我发布了类似问题hree的答案,只是在这里重写代码,因为有些人可能不喜欢阅读没有代码行的答案:
using System;
using System.Threading.Tasks;
namespace COREserver{
public static partial class COREtasks{ // partial to be able to split the same class in multiple files
public static async void RunHourlyTasks(params Action[] tasks)
{
DateTime runHour = DateTime.Now.AddHours(1.0);
TimeSpan ts = new TimeSpan(runHour.Hour, 0, 0); // ensure minutes and seconds to be ZERO
runHour = runHour.Date + ts;
while (true)
{
TimeSpan duration = runHour.Subtract(DateTime.Now);
if(duration.TotalMilliseconds <= 0.0)
{
Parallel.Invoke(tasks);
runHour = DateTime.Now.AddHours(1.0);
continue;
}
int delay = (int)(duration.TotalMilliseconds / 2);
await Task.Delay(30000); // 30 seconds
}
}
}
}
答案 2 :(得分:-1)
将您的计时器间隔设置为30000(30秒)并将其设置为 你的计时器的代码打勾:
private void timer1_Tick(object sender, EventArgs e)
{
if (DateTime.Now.Minute == 0)
{
// Do something
}
}