我有以下代码:
Task task = Navigation.PushAsync(myPage);
foreach(var temp in myModel)
{
//do bla bla
}
在我打过的页面上,当我完成了我需要的操作时,我这样做了:
this.Navigation.PopAsync();
问题是我想在for
完成执行后或task
完成执行后才执行myPage
循环。
我该如何解决这个问题?
答案 0 :(得分:2)
假设您使用异步方法,可以将实现更改为
await Navigation.PushAsync(myPage)
然后继续你的for循环。
如果您不在异步方法中,可以通过调用GetAwaiter()调用该方法并强制阻塞等待.GetResult();
Navigation.PushAsync(myPage).GetAwaiter().GetResult();
答案 1 :(得分:1)
您可以通过调用页面的OnDisapearing方法中的事件来执行此操作,然后您可以通过创建的导航服务订阅此事件,然后可以使用"TaskCompletionSource"
进行操作,直到页面完成其工作为止然后完成任务。
有关完成此操作的更多详细信息,you can check this blog post.
以下是您应使用的导航服务的概述:
public async Task<T> NavigateToModal<T>(string modalName)
{
var source = new TaskCompletionSource<T>();
if (modalName == nameof(NewItemPage))
{
var page = new NewItemPage();
page.PageDisapearing += (result) =>
{
var res = (T)Convert.ChangeType(result, typeof(T));
source.SetResult(res);
};
await App.Current.MainPage.Navigation.PushModalAsync(new NavigationPage(page));
}
return await source.Task;
}
答案 2 :(得分:0)
如果我说对了,您希望在执行 let wordFirst = true;
arr.sort(([wordA, indexA], [wordB, indexB]) => {
const byWord = wordA.localeCompare(wordB);
const byIndex = indexA - indexB;
return wordFirst ? byWord || byIndex : byIndex || byWord;
});
之后执行foreach循环。对吧?
我将提出以下方法之一:
1)在this.Navigation.PopAsync()
到达(推入)myPage
时执行任务:您可以将对象中需要的任何数据(例如PopAsync()
)移交给{ {1}}并在其中执行循环
myModel
2)您在原始页面上设置了一个标记,表明它已被myPage
隐藏,并在重新出现后执行代码。
protected override void OnDisappearing()
{
base.OnDisappearing();
foreach(var temp in myModel)
{
//do bla bla
}
}