C# - Refre sh метод периодически - PullRequest
2 голосов
/ 06 марта 2020

Я хочу периодически обновлять sh мой UWP-UI примерно через 5 минут. У меня есть метод «Page_Loaded», где вся информация из классов отправляется в элементы пользовательского интерфейса. Так что, если бы я refre sh этот метод, пользовательский интерфейс тоже сделал бы, верно?

Код выглядит так:

private async void Page_Loaded(object sender, RoutedEventArgs e)
        {
            RootObject myWeather = await Openweathermap.GetWeather();
            string icon = String.Format("http://openweathermap.org/img/wn/{0}@2x.png", myWeather.weather[0].icon);
            ResultImage.Source = new BitmapImage(new Uri(icon, UriKind.Absolute));

            TempTextBlock.Text = ((int)myWeather.main.temp).ToString() + "°";
            DescriptionTextBlock.Text = myWeather.weather[0].description;
            LocationTextBlock.Text = myWeather.name;

            var articlesList = NewsAPI.GetNews().Result.articles;
            lvNews.ItemsSource = articlesList;

            Welcometxt.Text = MainPage.WelcomeText();
        }

Итак, как я могу refre sh этот метод через 5 минут, чтобы он получил новую информацию и отправил ее в пользовательский интерфейс?

1 Ответ

1 голос
/ 09 марта 2020

Итак, как мне переосмыслить sh этот метод через 5 минут, чтобы он получал новую информацию и отправлял ее в пользовательский интерфейс?

Неоднократно вызывая Page_Loaded метод не рекомендуется, рекомендуется использовать DispatcherTimer, таймер в потоке пользовательского интерфейса.

Мы можем извлечь код внутри Page_Loaded как функцию.

private DispatcherTimer _timer;
public MainPage()
{
    this.InitializeComponent();
    _timer = new DispatcherTimer();
    _timer.Interval = TimeSpan.FromMinutes(5);
    _timer.Tick += Timer_Tick;
}

private async Task GetData()
{
    RootObject myWeather = await Openweathermap.GetWeather();
    string icon = String.Format("http://openweathermap.org/img/wn/{0}@2x.png", myWeather.weather[0].icon);
    ResultImage.Source = new BitmapImage(new Uri(icon, UriKind.Absolute));

    TempTextBlock.Text = ((int)myWeather.main.temp).ToString() + "°";
    DescriptionTextBlock.Text = myWeather.weather[0].description;
    LocationTextBlock.Text = myWeather.name;

    var articlesList = NewsAPI.GetNews().Result.articles;
    lvNews.ItemsSource = articlesList;

    Welcometxt.Text = MainPage.WelcomeText();
}

private async void Timer_Tick(object sender, object e)
{
    await GetData();
}

private async void Page_Loaded(object sender, RoutedEventArgs e)
{
    await GetData();
    _timer.Start();
}

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    _timer.Stop();
    base.OnNavigatedFrom(e);
}

С помощью DispatcherTimer.Tick мы можем регулярно выполнять задачи, а когда мы покидаем страницу, мы можем остановить таймер.

...