壁纸循环器上的计时器

时间:2009-02-06 04:41:57

标签: c# timer software-quality

我刚刚为Coding4Fun项目添加了一些额外的功能。我的项目设置了一个额外的选项,允许它在X时间后自动更改背景。 X是从ComboBox设置的。但是,我知道我已经以一种可怕的方式完成了这项工作,因为我创建了一个新的计时器类,并将System.Timers.Timer作为父级,因此当调用ElapsedEventHandler中的静态方法时,我能够回到表单并调用ChangeDesktopBackground()。

以用户定义的时间间隔调用ChangeDesktopBackground()的更好方法是什么?

这是我当前的解决方案,它涉及我将发送者作为我的继承计时器,然后获取对表单的引用,然后调用ChangeDesktopBackground方法。

private static void timerEvent(object sender, System.Timers.ElapsedEventArgs e)
{
    ((newTimer)sender).getCycleSettingsForm().ChangeDesktopBackground();
}

编辑:添加编码样本以显示当前解决方案

3 个答案:

答案 0 :(得分:0)

计时器可能是最直接的方式,虽然我不确定你是否正确使用计时器。以下是我在项目中使用计时器的方法:

// here we declare the timer that this class will use.
private Timer timer;

//I've shown the timer creation inside the constructor of a main form,
//but it may be done elsewhere depending on your needs
public Main()
{

   // other init stuff omitted

   timer = new Timer();     
   timer.Interval = 10000;  // 10 seconds between images
   timer.Tick += timer_Tick;   // attach the event handler (defined below)
}


void timer_Tick(object sender, EventArgs e)
{
   // this is where you'd show your next image    
}

然后,你将连接你的ComboBox onChange处理程序,这样你就可以改变timer.Interval。

答案 1 :(得分:0)

我在自己之前写过类似的东西。 System.Timers.Timer对此有点矫枉过正。你可能应该使用System.Windows.Forms.Timer,原因有两个:

  1. 你做的事情不一定太精确。 Windows计时器只是发送到您的Windows应用程序的消息泵的WM_TIMER消息,因此您没有获得超高精度,但每秒更改一次壁纸是不现实的。 (我写信给我每隔6个小时改一次)
  2. 当使用执行某种基于计时器的任务的Windows窗体应用程序时,如果使用System.Timers.Timer,则会遇到各种线程关联问题。任何Windows控件都与创建它的线程具有相似性,这意味着您只能修改该线程上的控件。 Windows.Forms.Timer将为您完成所有这些工作。 (对于未来的挑剔,改变壁纸并不真正重要,导致它是注册表值的变化,但规则通常都有)

答案 2 :(得分:0)

我会使用微软的Reactive Framework来实现这个目标。只是NuGet“Rx-WinForms”。

以下是代码:

=TRIM(REPT("\lvl", MATCH("zzz", A2:D2)-1)&CHAR(32)&INDEX(A2:D2, MATCH("zzz", A2:D2)))

要停止它,只需var subscription = Observable .Interval(TimeSpan.FromMinutes(1.0)) .ObserveOn(this) .Subscribe(n => this.getCycleSettingsForm().ChangeDesktopBackground());

简单。