Я понимаю, что 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()
из основного потока, он работает нормально.
Любой может решить проблему? Приветствия.
По-видимому, мне не нужно было использовать объект Timer
. Вот как я сделал это:
public static void StartTimer()
{
while (true)
{
UpdateTime();
Thread.Sleep(1000);
}
}
Спасибо за помощь, ребята!
Вы запускаете таймер в отдельном потоке. Запуск таймера - очень быстрая операция. Вот почему ваша нить завершается немедленно. События тика запускаются в поточном пуле асинхронно, когда наступит время.
Если вы хотите, чтобы поток ожидал чего-то, вы должны вставить код в процедуру потока, чтобы что-то ждать. На данный момент вы ничего не ждете.
Если вы хотите запустить процедуру таймера, просто позвоните ему.
В вашем методе StartTimer
вы можете вращаться вокруг бесконечного цикла и вызывать Thread.Sleep
чтобы отложить выполнение при необходимости. Я вижу, вы уже это поняли. Альтернативная идея - использовать таймер, но вместо того, чтобы запускать его из рабочего потока, запустите его из основного потока. Вам вообще не нужно вручную создавать темы.