J'ai un code qui est exécuté lorsqu'un ListView
est sélectionné. Étant donné que l'exécution de ce code peut prendre un temps considérable, je veux afficher un message d'avertissement. ActivityIndicator
pendant qu'il fonctionne.
J'ai lu de nombreux articles sur le thème de l'éducation. ActivityIndicator
et je crois que je l'ai configuré correctement. Je suis presque sûr que mon problème est dû au fait que le code en cours d'exécution bloque le thread de l'interface utilisateur, puisque l'interface se fige complètement pendant le processus.
J'ai travaillé sur toutes les variantes que j'ai pu trouver pour l'utilisation d'async/await, sans succès, donc je suppose que je fais toujours quelque chose d'incorrect.
Voici mon code :
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;
}
Donc :
-
buildThisList
est appelé lorsque leSelectedList
les changements de propriété. -
buildThisList
appellebuildBnBList
ce qui est un processus qui prend du temps. -
buildBnBList
ne contient rien qui soit fait de manière asynchrone. -
StatusBarIsVisible
est lié à la fois àIsVisible
yIsRunning
de laActivityIndicator
.
Comment puis-je coder cela pour que l'exécution buildBnBList
ne bloque pas le thread de l'interface utilisateur ?