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
Посмотри на мою кура.