特定日期和时间的C#操作

时间:2015-01-22 15:21:04

标签: c# time action

我正在尝试在给定的一周的特定时间到来时创建一个动作。

这是我到目前为止所拥有的:

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)

4 个答案:

答案 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()这两个字符串(fridayPatternthursdayPattern),然后找出哪个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秒检查一次。