【发布时间】:2017-03-16 14:37:42
【问题描述】:
在我的项目中,我想显示一个进度指示器,从 web 服务中检索数据并隐藏进度指示器。如果我这样做,我目前必须等到我从 web 服务中检索到数据,然后立即更新带有结果的 UI。但进度指示器永远不会出现。看来,我正在 UI 线程上工作或阻塞。但是在哪里?
这是我的代码的简单版本:
一些页面
private async void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
{
await ShowDetailView();
}
private async Task ShowDetailView()
{
var view = new MyView();
this.detailView = view;
await view.LoadContent();
}
SomeView
public async Task LoadContent()
{
var success = await LoadData();
if (success)
{
ShowInformation();
}
}
public async Task<bool> LoadData()
{
try
{
ShowLoadingProcess();
await Task.Delay(5000);
this.itemList = await WebService.Instance.GetData();
return true;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
return false;
}
finally
{
HideLoadingProcess();
}
}
private void ShowInformation()
{
Device.BeginInvokeOnMainThread(() =>
{
this.grid.Clear();
foreach(var item in this.itemList)
{
GridItem contentItem = new GridItem(item);
this.grid.Children.Add(contentItem);
}
}
}
private void ShowLoadingProcess()
{
Device.BeginInvokeOnMainThread(() => BringProgressIndicatorToFront());
}
private void HideLoadingProcess()
{
Device.BeginInvokeOnMainThread(() => BringProgressIndicatorToBack());
}
我尝试了不同的方法,但我在 UI 和后台线程之间不同步。例如。在 LoadData() 完成之前调用了 ShowInformation()。
有人可以告诉我这里出了什么问题吗?
【问题讨论】:
-
您正在寻找BackgroundWorker。这允许您运行异步任务并从中报告进度。
-
@LukeSamuel 如果您正确使用 TPL,则不需要 BGW。
标签: c# xamarin xamarin.forms async-await ui-thread