我有一个应用程序,用户可以在其中创建不同的通知,例如便签并设置其开始时间。当他按下开始按钮时,计时器启动,这些提醒应在设置时弹出。我搜索了其他答案,例如this one,但问题是通知的时间不同。
那么安排激活通知的事件的最佳方法是什么? 我可以想到他们的优点和缺点的两种可能方式:
运行DispatcherTimer
,每秒滴答一次,检查通知的时间是否已经到来并弹出。 优点:单DispatcherTimer
个实例。 缺点:每秒滴答一次并检查所有通知是一种开销。
为每个通知创建一个DispatcherTimer
,让他们自己处理时间。 优点:每个计时器只会弹出一次以弹出通知。 缺点:太多的计时器是一个开销,可能很难控制。
我是否在正确的轨道上?资源明智的两种方法中哪一种更好?我有没有第三种更好的方式可以忽略?
编辑:如果它有任何区别,通知也应该在用户定义的一些时间后自动关闭,并按照用户定义的固定间隔重复。
答案 0 :(得分:2)
我已经使用了很多方法在C#应用程序(线程,定时器,Quartz API ......)中安排事件,我认为 Quertz.NET API - {{3} } - 是你能找到的最好的工具(至少对我而言)。它使用简单易用。
您的职业类示例:
public class HelloJob : IJob
{
public void Execute(IJobExecutionContext context)
{
Console.WriteLine("Greetings from HelloJob!");
}
}
来自互联网的示例:
// Instantiate the Quartz.NET scheduler
var schedulerFactory = new StdSchedulerFactory();
var scheduler = schedulerFactory.GetScheduler();
// Instantiate the JobDetail object passing in the type of your
// class. Your class needs to implement a IJob interface
var job = new JobDetail("job1", "group1", typeof(HelloJob));
// Instantiate a trigger using the basic cron syntax.
// Example : run at 1AM every Monday - Friday.
var trigger = new CronTrigger(
"trigger1", "group1", "job1", "group1", "0 0 1 ? * MON-FRI");
// Add the job to the scheduler
scheduler.AddJob(job, true);
scheduler.ScheduleJob(trigger);
您可以在快速搜索指南link中找到有用的代码示例。
问候。
答案 1 :(得分:0)
如果要在单个进程内使用通知系统,请继续使用单个调度程序计时器。确保将调度程序计时器设置为near通知。每次创建新通知或计时器命中时,请将时间更改为下一个最近的通知。
这样你就可以避免每次处理。 例如:当有人创建通知点计时器时,第一次。如果其他人在第一次点击之前创建另一个通知,则将计时器更改为秒。如果第二次是第一次之后,请在调度第一次通知回叫后更改计时器。如果它的线程你可能需要努力工作以获得线程安全。
如果跨进程使用Windows任务调度程序需要通知,该任务调度程序已知道如何运行计时器并按时调用我们的代码。您可能需要使用某种IPC(WCF net.pipe,msmq等...)来实现通知。