[英]How to wait for a Navigation.PushAsync() task to complete before continue executing
我有以下代码:
Task task = Navigation.PushAsync(myPage);
foreach(var temp in myModel)
{
//do bla bla
}
在我调用的页面上,当我执行完我需要的操作后,我会这样做:
this.Navigation.PopAsync();
问题是我只想在我的task
完成执行或myPage
完成执行后执行我的for
循环。
我该如何解决这个问题?
假设您使用异步方法,您可以将实现更改为
await Navigation.PushAsync(myPage)
然后继续你的 for 循环。
如果您不在异步方法中,则可以调用该方法并通过调用 GetAwaiter().GetResult(); 强制阻塞等待。
Navigation.PushAsync(myPage).GetAwaiter().GetResult();
您可以通过从页面的 OnDisapearing 方法调用事件来完成此操作,然后您创建的导航服务可以订阅此事件,然后您可以使用"TaskCompletionSource"
等待,直到您的页面完成其工作然后完成任务. 有关完成此操作的更多详细信息, 您可以查看此博客文章。
以下是您应该使用的导航服务的概述:
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;
}
如果我this.Navigation.PopAsync()
对了,您希望在执行this.Navigation.PopAsync()
之后执行 foreach 循环。 对吗?
我会提出以下方法之一:
1)在(推送) myPage
上执行任务PopAsync()
:您可以将对象中所需的任何数据(例如myModel
)移交给myPage
并在其中执行循环
protected override void OnDisappearing()
{
base.OnDisappearing();
foreach(var temp in myModel)
{
//do bla bla
}
}
2)您在原始页面上设置了一个标志,它已被pushAsync(myPage)
隐藏,并在重新出现后执行您的代码。
bool pushStarted;
protected void YourMethod()
{
pushStarted = true;
await Navigation.PushAsync(myPage);
}
protected override void OnAppearing()
{
base.OnAppearing();
if(pushStarted)
{
pushStarted = false;
foreach(var temp in myModel)
{
//do bla bla
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.