【发布时间】:2018-02-14 07:46:54
【问题描述】:
我有在选择ListView 项目时执行的代码。由于此代码可能需要相当长的时间来执行,我想在它运行时显示一个ActivityIndicator。
我已经阅读了很多关于 ActivityIndicator 的帖子,我相信我已经正确设置了它。我很确定我的问题是由于正在运行的代码阻塞了 UI 线程,因为 UI 在此过程中完全冻结。
我已经找到了使用 async/await 的所有变体,但没有运气,所以我假设我仍然在做错事。
这是我的代码:
private ListItem selectedList;
public ListItem SelectedList
{
get
{
return selectedList;
}
set
{
if (selectedList != value)
{
var oldValue = selectedList;
selectedList = value;
buildThisList();
}
}
}
private async void buildThisList()
{
StatusBarIsVisibile = true;
ThisList = Task.Run(async () =>
{
return await buildBnBList(SelectedList, selectedLocation,
thisYearList.ListId)
.ConfigureAwait(false);
}).Result; // 1.8 seconds
StatusBarIsVisibile = false;
ThisList.MainVM = this;
ThisList.BuildView();
PIShowListHeaderText = SelectedList.Title.Trim();
}
private async Task<BnBList> buildBnBList(ListItem pSelectedList, State pselectedLocation, int pListId)
{
BnBList newList = new BnBList(pSelectedList, pselectedLocation, pListId);
List<BirdsnBflysMaster> bbfList =
App.BnBRepo.GetBirdsnBflys(selectedList.ListType); // 1.3 seconds
Lists parentList = App.BnBRepo.GetAList(SelectedList.ListId); // .5 seconds
BnBItem newBnBItem;
foreach (BirdsnBflysMaster bbf in bbfList) // .4 seconds
{
newBnBItem = new BnBItem(parentList, bbf, selectedLocation, newList, thisYearList.ListId);
newList.ListAll.Add(newBnBItem);
if (newBnBItem.ListTypeID == "Bird")
{
...
}
else
{
...
}
}
return newList;
}
所以:
-
buildThisList在SelectedList属性更改时被调用。 -
buildThisList调用buildBnBList这是一个耗时的过程。 -
buildBnBList中没有任何异步完成的内容。 -
StatusBarIsVisible绑定到ActivityIndicator的IsVisible和IsRunning。
如何编写代码以使执行 buildBnBList 不会阻塞 UI 线程?
【问题讨论】:
标签: c# asynchronous xamarin.forms portable-class-library