1

我刚刚向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();
}

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

4

3 回答 3

0

我之前写过类似的东西。System.Timers.Timer 对此太过分了。您可能应该使用 System.Windows.Forms.Timer,原因如下:

  1. 您正在做的事情不必太精确。Windows 计时器只是发送到 Windows 应用程序消息泵的 WM_TIMER 消息,因此您不会获得超高的精度,但每秒更换一次壁纸是不现实的。(我写了我的,每 6 小时左右更换一次)
  2. 在使用执行某种基于计时器的任务的 Windows 窗体应用程序时,如果您使用 System.Timers.Timer,您将遇到各种线程关联问题。任何 Windows 控件都与创建它的线程有关联,这意味着您只能修改该线程上的控件。Windows.Forms.Timer 将为您完成所有这些工作。(对于未来的吹毛求疵者,更换壁纸并不算数,因为这是注册表值的更改,但规则普遍适用)
于 2009-02-12T03:10:17.523 回答
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。

于 2009-02-06T06:29:13.643 回答
0

我会为此使用 Microsoft 的反应式框架。只是 NuGet“Rx-WinForms”。

这是代码:

var subscription =
    Observable
        .Interval(TimeSpan.FromMinutes(1.0))
        .ObserveOn(this)
        .Subscribe(n => this.getCycleSettingsForm().ChangeDesktopBackground());

阻止它只是做subscription.Dispose()

简单的。

于 2016-01-09T14:52:53.727 回答