2015-02-13 1 views
0

Я пытаюсь понять класс таймера и связанную с ним обработку событий. У меня есть приложение, которое нужно будет вызывать событие в определенное время, зависящее от данных, извлеченных из базы данных. Естественно запланированные задачи для этого не подходят.C# WinForms многократный повторитель таймера дублирующий обработчик событий

Вот код, который я пытаюсь понять

 private Timer setTimer = new Timer(); 

    public Form1() 
    { 
     InitializeComponent(); 
     TimedProcess(null, null); 

    } 

    private void SetTimer(DateTime dtNextStop) 
    { 
     TimeSpan span = dtNextStop - DateTime.Now; 
     int ms = (int)span.TotalMilliseconds; 
     setTimer.Interval = ms; 
     setTimer.Tick += new EventHandler(TimedProcess); 
     setTimer.Start(); 
    } 


    public void TimedProcess(Object sender, EventArgs e) 
    { 
     setTimer.Stop(); 
     setTimer.Dispose(); 
     txtLog.Text = txtLog.Text = "Tick " + DateTime.Now.ToString("HH:mm:ss") + "\r\n" + txtLog.Text; 
     SetTimer(DateTime.Now.AddSeconds(4)); 
    } 

Я пытался быть умным (ха-ха потерпел неудачу в том, что один), объявив таймер на глобальном уровне, чтобы сэкономить ресурсы и использовать это для следующего временного разреза , Я заметил, что приложение было утечкой памяти, поэтому я создал текстовое поле для вывода тиков. Это принесло некоторые странные результаты. Я, очевидно, что-то делаю неправильно, любая помощь будет очень признательна.

Tick 18:44:50 
Tick 18:44:50 
Tick 18:44:50 
Tick 18:44:50 
Tick 18:44:50 
Tick 18:44:50 
Tick 18:44:50 
Tick 18:44:50 
Tick 18:44:46 
Tick 18:44:46 
Tick 18:44:46 
Tick 18:44:46 
Tick 18:44:42 
Tick 18:44:42 
Tick 18:44:38 
Tick 18:44:34 

ответ

2

Проблема заключается в том, что SetTimer снова прикрепление обработчик событий, вам нужно только сделать это один раз.

+0

Согласен. Нет причин для 'setTimer.Dispose()'. –

+0

Конечно, большое вам спасибо –

1

В коде есть много чего-то неправильного; Я не уверен, что вызывает то, что вы видите как «проблема».

Для начала, вы используете только один объект Timer, но вы, по-видимому, Dispose(), при этом каждый звонок до TimedProcess. Я настоятельно рекомендую не продолжать использовать объект, который вы разместили (или, другими словами, не удалять объект, который собираетесь продолжать использовать).

Далее вы регистрируетесь для события setTimer.Tick каждый раз, когда вызывается SetTimer. Вероятно, поэтому вы видите больше строк для каждого запуска события Tick.

setTimer a System.Timers.Timer или System.Windows.Forms.Timer? Если последнее, оно должно быть связано с элементом управления, и если первое, вам нужно внести Invoke изменений в графический интерфейс при запуске таймера, поскольку он будет запущен в фоновом потоке.