繁体   English   中英

如何在继续执行之前等待 Navigation.PushAsync() 任务完成

[英]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)

然后继续你的 f​​or 循环。

如果您不在异步方法中,则可以调用该方法并通过调用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM