ProgressIndicator не отображается точно в асинхронной функции

Я новичок в WP. Я пытаюсь показать ProgressIndicator при загрузке данных с сервера и скрыть их при завершении загрузки. Однако у меня возникла проблема: ProgressIndicator показывать только когда мой MessageBox показал. Вот мой код:

    private void MainPageLoaded(object sender, RoutedEventArgs e)
    {
        // Create progress loading 
        SystemTray.ProgressIndicator = new ProgressIndicator();
        SystemTray.ProgressIndicator.IsIndeterminate = true;
        SystemTray.ProgressIndicator.IsIndeterminate = true;
        SystemTray.ProgressIndicator.Text = "Loading...";
        SyncDbIfNeed();
    }


    private void ShowHideProgressIndicator(Boolean isVisible)
    {
        SystemTray.ProgressIndicator.IsVisible = isVisible;
        SystemTray.ProgressIndicator.IsIndeterminate = isVisible;
        Debug.WriteLine("ShowHide: " + isVisible);
    }


    private async void SyncDbIfNeed()
    {
        if (!MySettings.IsCategorySynced())
        {
            ShowHideProgressIndicator(true);
            try
            {
                HttpClient httpClient = new HttpClient();
                String json = await httpClient.GetStringAsync(MyConstants.UrlGetAllCategory);
                MessageBox.Show(json);

            }
            catch (Exception e)
            {
                MessageBox.Show("Unexpected error");
            }
            ShowHideProgressIndicator(false);

        }
    }
}

Кто-нибудь может объяснить это и дать мне совет? Благодарю.

1 ответ

async void методы должны использоваться только для обработчиков событий. Любой другой асинхронный метод должен возвращать Task или же Task<T>,

Вы также должны отделить логинку интерфейса от логики не-интерфейса.

Попробуйте это вместо этого:

private async void MainPageLoaded(object sender, RoutedEventArgs e)
{
    SystemTray.ProgressIndicator = new ProgressIndicator();
    SystemTray.ProgressIndicator.IsIndeterminate = true;
    SystemTray.ProgressIndicator.Text = "Loading...";

    ShowHideProgressIndicator(true);

    try
    {
        var json = await SyncDbIfNeedAsync();
    }
    catch (Exception e)
    {
        MessageBox.Show("Unexpected error");
    }

    ShowHideProgressIndicator(false);
}

private void ShowHideProgressIndicator(Boolean isVisible)
{
    SystemTray.ProgressIndicator.IsVisible = isVisible;
    SystemTray.ProgressIndicator.IsIndeterminate = isVisible;
    Debug.WriteLine("ShowHide: " + isVisible);
}


private async Task<string> SyncDbIfNeedAsync()
{
    if (!MySettings.IsCategorySynced())
    {
        HttpClient httpClient = new HttpClient();
        return await httpClient.GetStringAsync(MyConstants.UrlGetAllCategory);
        MessageBox.Show(json);
    }
}

Чтобы узнать больше о async-awaitПосмотри на мою кура.

Другие вопросы по тегам