C# 壁纸循环器上的计时器

C# 壁纸循环器上的计时器,c#,timer,software-quality,C#,Timer,Software Quality,我刚刚在一个项目中添加了一些额外的功能。我用一个额外的选项设置了我的项目,允许它在X时间后自动更改背景。X是从组合框中设置的。但是,我知道我这样做的方式很糟糕,因为我创建了一个新的timer类,将System.Timers.timer作为父类,所以当调用ElapsedEventHandler中的静态方法时,我能够返回表单并调用ChangeDesktopBackground() 以用户定义的间隔调用ChangeDesktopBackground()的更好方法是什么 这是我当前的解决方案,其中包括将

我刚刚在一个项目中添加了一些额外的功能。我用一个额外的选项设置了我的项目,允许它在X时间后自动更改背景。X是从组合框中设置的。但是,我知道我这样做的方式很糟糕,因为我创建了一个新的timer类,将System.Timers.timer作为父类,所以当调用ElapsedEventHandler中的静态方法时,我能够返回表单并调用ChangeDesktopBackground()

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

这是我当前的解决方案,其中包括将发送方转换为继承的计时器,然后获取对表单的引用,然后调用ChangeDesktopBackground方法

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

编辑:添加了显示当前解决方案的编码示例

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

// 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    
}

然后,在更改处理程序上连接组合框,这样就可以更改timer.Interval。

我以前写过类似的东西。System.Timers.Timer在这方面做得太过分了。出于以下几个原因,您可能应该使用System.Windows.Forms.Timer:

  • 你在做一些不必太精确的事情。Windows计时器只是发送到Windows应用程序消息泵的WM_计时器消息,因此您不会获得超高的精度,但每秒更改一次壁纸是不现实的。(我写了一封信,要求每6小时左右更换一次)
  • 当使用Windows窗体应用程序执行某种基于计时器的任务时,如果使用System.Timers.timer,您将遇到各种线程关联问题。任何Windows控件都与创建它的线程有关联,这意味着您只能修改该线程上的控件。Windows.Forms.Timer将为您完成所有这些工作。(对于未来的挑剔者来说,更改墙纸并不重要,因为这是一个注册表值更改,但规则通常适用)

  • 我会使用微软的反应式框架。只需获取“Rx WinForms”

    代码如下:

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

    简单