запуск таймера из другого потока в c#

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

  1. у меня есть форма windows, содержащая кнопку
  2. когда я нажимаю на эту кнопку, я начинаю настраиваться нити
Thread thread1 = new Thread(new ParameterizedThreadStart( execute2));
thread1.Start(externalFileParams);
  1. код внутри потока выполняется очень хорошо
  2. в последней строке этого потока я запускаю таймер

.

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 событие: событие возникает в основном потоке, когда поток завершается. Используйте этот обработчик событий для перезапуска таймера.