如何等待 Navigation.PushAsync() 任务完成,然后再继续执行



我有以下代码:

 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(( 强制阻止等待。获取结果((;

Navigation.PushAsync(myPage).GetAwaiter().GetResult();
您可以通过

从页面的 OnDisapearing 方法调用事件来执行此操作,然后您创建的导航服务可以订阅此事件,然后您可以使用 "TaskCompletionSource" wati,直到页面完成其工作,然后完成任务。有关完成此操作的更多详细信息,您可以查看此博客文章。

以下是应使用的导航服务的概述:

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()后执行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
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新