@serrcel

Как реализовать периодичное обращение к API?

Пытаюсь организовать периодичное обращение к API. Решил организовать отдельный поток с бесконечным циклом, где буду слипать тред на нужно кол-во секунд.
Есть функция UpdateInfo, которая вызывает функцию, что обращается к API и меняет данные.
public class AboutViewModel : BaseViewModel
    {
        private Route route;
        private Transport transport;
        private string _Stop;
        private string _NextTime;
        private string _PrevTime;
        private object locker = new object();

        private string GetTimeNoun(string time)
        {
            int n = int.Parse(time);
            string s = " минут";
            if (n % 10 == 1) s = " минута";
            if (n % 10 >= 2 && n % 10 <= 4) s = " минуты";
            return s;
        }

        public string Stop 
        {
            get { return _Stop; }
            set { _Stop = value; OnPropertyChanged("Stop"); }
        }
        public string NextTime
        {
            get { return _NextTime; }
            set { _NextTime = value; OnPropertyChanged("NextTime"); }
        }
        public string PrevTime
        {
            get { return _PrevTime; }
            set { _PrevTime = value; OnPropertyChanged("PrevTime"); }
        }

        public AboutViewModel()
        {
            transport = new Transport("Aboba202");
            Thread updateThread = new Thread(UpdateInfo);
            updateThread.Start();
        }
        public void GetData(Transport ts)
        {
            API.GetRequest(0, ts.Code);
            PrevTime = API.GetTimePrev() + GetTimeNoun(API.GetTimePrev());
            NextTime = API.GetTimeNext() + GetTimeNoun(API.GetTimePrev());
            Stop = "Следующая остановка: " + API.GetNextStopId();
        }
        private void UpdateInfo()
        {
            while (true)
            {
                try
                {
                    lock(locker) 
                    {
                        Debug.WriteLine("Получение данных с сервера: " + DateTime.Now);
                        GetData(transport);
                        Thread.Sleep(10000);
                    }
                }
                catch 
                {

                }
            }
        }
    }

Однако это работает буквально первые 30 секунд, потом перестает приходить ответ с сервера, после чего поток начинает тормозить,.
  • Вопрос задан
  • 105 просмотров
Пригласить эксперта
Ответы на вопрос 1
@SZolotov
Asp.net core, MAUI,WPF,Qt, Avalonia
while (true) лютейшее зло.
Используйте таймер. Если используете xamarin forms можно этот взять этот
Device.StartTimer(TimeSpan interval, Func<bool> callback);

Ну и про Throttling и debouncing почитайте.
И про асинхронные методы, возможно тогда и чистые треды не нужны станут.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы