#c# #timer #callback
Вопрос:
Это класс видео, в котором есть метод Play()
, который просто создает таймер с интервалом в 1 секунду, но, похоже, он выполняет функцию обратного вызова только один раз!
class VideoPost : Post
{
private int counter;
private Timer timer;
protected int Duration;
protected string VideoUrl;
public VideoPost(string title, string user, int duration, string videoUrl): base(title, user)
{
Duration = duration;
VideoUrl = videoUrl;
}
public void Play()
{
Console.WriteLine("Playing video");
timer = new Timer(TimerCallBack, null, 0, 1000);
}
public void Stop()
{
timer.Dispose();
if (counter < Duration)
{
Console.WriteLine("Video stopped at {0}s", counter);
} else
{
Console.WriteLine("Video has ended");
}
}
private void TimerCallBack(Object o)
{
if (counter < Duration)
{
Console.WriteLine("Video is at {0}s", counter);
counter ;
} else
{
Stop();
}
}
public override string ToString()
{
return String.Format("Post - {0}, {1} written by {2}, Video -> {3} of the length {4}", Id, Title, User, VideoUrl, Duration);
}
}
Вот как это называется
VideoPost newVideoPost = new VideoPost("video of my fortnite montage", "damilola jerugba", 10, "https://www.video.com/montage.mp4");
Console.WriteLine(newVideoPost.ToString());
newVideoPost.Play();
Комментарии:
1. Ваш код этого не показывает, но, по-видимому, у вас есть какой-то другой код, который продолжает
VideoPost
работать достаточно долго, чтобы таймер снова запустился? И действительно, достаточно долго, чтобы ваше приложение не выходило!2. Как выглядит ваш результат?
3. @ragerory это просто говорит
Playing video
, а затем завершает программу4. Если после newVideoPost.Play() нет кода, который поддерживает работу программы, то да, программа завершится.
5. Вот как просто работают такие вещи. Время жизни вашего основного потока определяет время жизни вашей программы. Тогда другие потоки будут уничтожены. Более конкретно, существует различие между потоками переднего плана и фоном. Основной поток, запускаемый вашей программой, является потоком переднего плана, таймер запускает фоновый поток. И когда поток переднего плана больше не выполняется, программа заканчивается.