2009-02-06 3 views
1

Я добавил дополнительную функциональность в проект Coding4Fun. У меня есть мой проект с дополнительным параметром, позволяющим автоматически изменять фон после X-х раз. X устанавливается из ComboBox. Тем не менее, я знаю, что я сделал это ужасно, так как я создал новый класс таймера с System.Timers.Timer как родитель, поэтому, когда вызывается статический метод в ElapsedEventHandler, я могу вернуться к формы и вызова ChangeDesktopBackground().Timer on Wallpaper Cycler

Каков наилучший способ вызова ChangeDesktopBackground() в определенный пользователем интервал?

Вот мое текущее решение, в результате которого я отправляю отправителя как мой унаследованный таймер, который затем получает ссылку на форму, которая затем вызывает метод ChangeDesktopBackground.

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

Edit: Добавлено кодирование образца, чтобы показать текущее решение

ответ

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  
} 

Затем вы подключить обработчик OnChange ComboBox таким образом, что вы бы меняющийся timer.Interval.

0

Я написал нечто подобное перед собой. System.Timers.Timer для этого лишний. Вероятно, вы должны использовать System.Windows.Forms.Timer по нескольким причинам:

  1. Вы делаете то, что не должно быть слишком точным. Таймер Windows - это просто сообщение WM_TIMER, отправленное на ваш насос сообщений приложений Windows, поэтому вы не получаете сверхтекую точность, но менять обои раз в секунду нереально. (Я написал, чтобы меня меняли каждые 6 часов или около того)
  2. При использовании приложения Windows Forms, которое выполняет какую-то задачу на основе таймера, вы будете сталкиваться с проблемами при подключении к различным темам, если вы идете с Системой. Timers.Timer. Любой элемент управления Windows имеет сродство к потоку, на котором он был создан, что означает, что вы можете изменять только элемент управления в этом потоке. Windows.Forms.Timer сделает все это для вас. (Для будущих nitpickers смена обоев на самом деле не учитывается, потому что это изменение значения реестра, но правило в целом)
0

Для этого я использовал бы Reactive Framework от Microsoft. Просто NuGet «Rx-WinForms».

Вот код:

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

Чтобы остановить это просто сделать subscription.Dispose().

Простой.