запуск таймера из другого потока в c#
Привет я вступил в некоторые проблемы, связанные с таймером. надеюсь, кто-то может помочь..
- у меня есть форма windows, содержащая кнопку
- когда я нажимаю на эту кнопку, я начинаю настраиваться нити
Thread thread1 = new Thread(new ParameterizedThreadStart( execute2));
thread1.Start(externalFileParams);
- код внутри потока выполняется очень хорошо
- в последней строке этого потока я запускаю таймер
.
public void execute2(Object ob)
{
if (ob is ExternalFileParams)
{
if (boolean_variable== true)
executeMyMethod();//this also executes very well if condition is true
else
{
timer1.enabled = true;
timer1.start();
}
}
}
}
5 но событие тика таймера не уволен
Я работаю над VS2008 3.5 framework. Я перетащил таймер из toolbox и установил его Interval
до 300 также пытался установить Enabled
true / false
метод timer1_Tick(Object sender , EventArgs e)
но его не уволили
может ли кто-нибудь предположить, что я делаю неправильно?
4 ответов
Вы можете попробовать запустить таймер следующим образом:
добавить в конструктор формы это:
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
// Set the Interval to 1 second.
aTimer.Interval = 1000;
добавьте этот метод в Form1:
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
//do something with the timer
}
на кнопку нажмите событие добавить это:
aTimer.Enabled = true;
этот таймер уже резьбовой, поэтому нет необходимости запускать новый поток.
Это правда, что говорит Матиас Фидемрайзер. Но, есть работа вокруг...
когда у вас есть элемент управления на форме, который будет вызываться (например. строка состояния), просто вызовите это!
пример кода C#:
private void Form1_Load(object sender, EventArgs e)
{
Thread sampleThread = new Thread(delegate()
{
// Invoke your control like this
this.statusStrip1.Invoke(new MethodInvoker(delegate()
{
timer1.Start();
}));
});
sampleThread.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
MessageBox.Show("I just ticked!");
}
Я бы использовал BackgroundWorker (вместо raw thread). Основной поток будет подписываться на RunWorkerCompleted событие: событие возникает в основном потоке, когда поток завершается. Используйте этот обработчик событий для перезапуска таймера.