Предотвращение окончания потока

1

Я понимаю, что Thread завершится, когда будет выполнен весь код, который он был назначен, но как я могу сделать так, чтобы он оставался в ожидании события? Вот простой взгляд на мой код, чтобы вы могли лучше понять, что моя проблема:

public static class TimeUpdater
{

        static TimeUpdater()
        {
            //Initialize the Timer object
            timer = new Timer();
            timer.Interval = 1000; 
            timer.Tick += timer_Tick;
        }

        public static void StartTimer()
        {
            timer.Start();
        }

        private static void timer_Tick(object sender, EventArgs e)
        {
            //Do something          
        }

}

Из основной темы, вот как я называю эти методы:

        Thread timeThread = new Thread(TimeUpdater.StartTimer);
        timeThread.Name = "Time Updater";

        timeThread.Start();

Что это делает, так это то, что он входит в метод StartTimer(), запускает его, а затем поток завершается, даже не входя в timer_Tick события timer_Tick. Если я вызываю StartTimer() из основного потока, он работает нормально.

Любой может решить проблему? Приветствия.

  • 2
    Почему вы используете поток и таймер? Почему бы просто не использовать таймер или просто поток?
  • 0
    Я использую как поток, так и таймер, потому что я хочу, чтобы операция выполнялась во вторичном потоке каждую 1 секунду.
Показать ещё 3 комментария
Теги:
multithreading

3 ответа

1

По-видимому, мне не нужно было использовать объект Timer. Вот как я сделал это:

    public static void StartTimer()
    {
        while (true)
        {
            UpdateTime();
            Thread.Sleep(1000);
        }
    }

Спасибо за помощь, ребята!

1

Вы запускаете таймер в отдельном потоке. Запуск таймера - очень быстрая операция. Вот почему ваша нить завершается немедленно. События тика запускаются в поточном пуле асинхронно, когда наступит время.

Если вы хотите, чтобы поток ожидал чего-то, вы должны вставить код в процедуру потока, чтобы что-то ждать. На данный момент вы ничего не ждете.

Если вы хотите запустить процедуру таймера, просто позвоните ему.

  • 0
    Я не могу просто вызвать процедуру таймера, я хочу, чтобы она запускалась каждую 1 секунду. Как я могу заставить его ждать? Извините, я новичок в многопоточности.
  • 0
    Подожди зачем ?
0

В вашем методе StartTimer вы можете вращаться вокруг бесконечного цикла и вызывать Thread.Sleep чтобы отложить выполнение при необходимости. Я вижу, вы уже это поняли. Альтернативная идея - использовать таймер, но вместо того, чтобы запускать его из рабочего потока, запустите его из основного потока. Вам вообще не нужно вручную создавать темы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню