我正在尝试在给定的一周的特定时间到来时创建一个动作。
这是我到目前为止所拥有的:
private void wbnotifier_CheckedChanged(object sender, EventArgs e)
{
if (DateTime.UtcNow.DayOfWeek == DayOfWeek.Friday)
MessageBox.Show ("It's Friday");
if (DateTime.UtcNow.DayOfWeek == DayOfWeek.Thursday)
MessageBox.Show("It's Thursday");
}
如何安排,以便星期五下午1:00和星期四下午5:00触发行动?
在同一天多次相似吗? (周五,下午1:00,下午3:00,下午6:00)
答案 0 :(得分:1)
如果您想在.NET中安排内容,请查看Quartz.net。以下是CronTrigger的示例:
// Build a trigger that will fire on Wednesdays at 10:42 am, in a TimeZone other // than the system's default:
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithSchedule(CronScheduleBuilder
.WeeklyOnDayAndHourAndMinute(DayOfWeek.Wednesday, 10, 42)
.InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time")))
.ForJob(myJobKey)
.Build();
答案 1 :(得分:0)
查看ncrontab项目。 (您可以手动将DLL引用添加到解决方案中,也可以只是install it with NuGet。)
ncrontab可以轻松配置与您类似的任务。 在您的代码或App.config中,您只需定义一个由5部分组成的字符串:
* * * * *
- - - - -
| | | | |
| | | | +----- day of week (0 - 6) (Sunday=0)
| | | +------- month (1 - 12)
| | +--------- day of month (1 - 31)
| +----------- hour (0 - 23)
+------------- min (0 - 59)
使它更简单:是否可以同时启动两个任务? AFAIK无法在同一模式下为每一天配置单独的时间。
string pattern = "* 17 * * 4,5";
如果这对您不实用,您可以定义两种不同的模式,然后检查哪一种模式更早出现。
在您的情况下,这可能如下所示:
// Friday 1 PM
string fridayPattern = "* 13 * * 5";
或
// Thursday 5 PM
string thursdayPattern = "* 17 * * 4";
解释模式的代码可能如下所示:
CrontabSchedule schedule = CrontabSchedule.Parse(pattern);
DateTime nextOccurrence = this.schedule.GetNextOccurrence(DateTime.Now);
TimeSpan interval = nextOccurrence.Subtract(now);
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = interval.TotalMilliseconds;
timer.Elapsed -= this.OnScheduleTimerElapsed;
timer.Elapsed += this.OnScheduleTimerElapsed;
timer.Start();
注意:
如果您使用的是2模式创意,那么您可以CrontabSchedule.Parse()
这两个字符串(fridayPattern
和thursdayPattern
),然后找出哪个GetNextOccurrence()
会更早出现。
无论哪种方式,当然,你需要处理这个事件:
private void OnScheduleTimerElapsed(object sender, ElapsedEventArgs e)
{
this.timer.Stop();
this.timer.Elapsed -= this.OnScheduleTimerElapsed;
// Start your work here.
}
您的第二个问题:
在同一天配置多个运行将如下所示:
// Friday, 1:00 PM, 3:00 PM, 6:00 PM
string multipleRunsOnSameDayPattern = "* 13,15,18 * * 5"
答案 2 :(得分:-1)
对于每周定期通知,您可以使用下面的内容
Dictionary<DayOfWeek, Dictionary<TimeSpan, Action>> recurringNotifications = new Dictionary<DayOfWeek, Dictionary<TimeSpan, Action>>();
recurringNotifications.Add(DayOfWeek.Friday, new Dictionary<TimeSpan, Action>(){ {TimeSpan.FromHours(1), () => Console.WriteLine("1 AM") }});
在你的计时器上,你可以做一些像
这样的事情var todaysEvents = recurringNotifications[DateTime.UtcNow.DayOfWeek];
todaysEvents[TimeSpan.FromHours(1)].BeginInvoke();
或者您可以选择操作并将其放入某个队列中,并使用单独的线程同步或异步执行它们。在那种情况下,没有机会错过第二名。
答案 3 :(得分:-2)
这种类型的陈述很难自动化,你必须每天做一个转换案例,并且每天都要为每小时做一个转换案例。另一种方法是存储一个DateTime和if (list.Any(x => x.DayOfWeek == DateTime.UtcNow.DayOfWeek && x.Hour == DateTime.UtcNow.Hour) doStuff()
List,你需要在线程或计时器中每隔x秒检查一次。