PushAsync无需等待即可运行

时间:2017-12-04 15:05:54

标签: c# xamarin xamarin.forms async-await

我正在使用Navigation.PushAsync导航到新页面,当工作完成后,它会调用PopAsync返回上一页。问题是第一页需要等待新页面弹出然后继续一些工作。所以我这样做:

// source page:
DoWork();
await Navigation.PushAsync(new TargetPage());  <== this does not wait for the page!??
DoOtherWork();

我观察到DoOtherWork部分会在显示新页面时立即运行,直到它被解除为止。但是我在这里使用await,这意味着后面的部分应该是异步任务完成后的延续,对吧?为什么不等待导航任务就会运行?

2 个答案:

答案 0 :(得分:3)

await Navigation.PushAsync(new TargetPage());

此代码&#34;等待&#34;直到&#34; TargetPage&#34;可视化,然后代码继续&#34; OnOtherCode&#34;。

如果您想在关闭TargetPage后执行某些代码,则应在Navigation.PopAsync之后或在&#34; TargetPage的OnDisappearing&#34;中添加此代码。事件

另一个解决方案可以是:在&#34; TargetPage的OnDisappearing&#34;中使用MessagingCenter.Send。事件并在“呼叫页面”中订阅相同的消息

答案 1 :(得分:0)

你可以这样做:

public async Task<bool> openContentPageForResult()
{
    TaskCompletionSource<bool> waitToCloseTask = new TaskCompletionSource<bool>();
    MyPage myNewPage = new MyPage();
    myNewPage.Disappearing += (sender2, e2) =>
    {
        waitToCloseTask.SetResult(true);
    };
    await App.Current.MainPage.Navigation.PushAsync(myNewPage);
    return await waitToCloseTask.Task;
}

然后只需调用此方法并等待结果,在本例中为布尔结果。

bool myResult = await openContentPageForResult();