【问题标题】:PushAsync runs without awaitPushAsync 无需等待即可运行
【发布时间】:2017-12-04 15:05:54
【问题描述】:

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

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

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

【问题讨论】:

  • 新页面显示或关闭时任务是否完成?你假设后者。但是你的假设正确吗?根据您的描述,我希望是前者。
  • 你的意思是任务只管理页面的显示,而不是等待它的关闭?那么导航如何连接两个页面呢?
  • 看这里的例子:developer.xamarin.com/api/member/… 看来你需要等待 Pop 等待解雇。 Return 的文档文本让我有点困惑。这似乎与示例相矛盾?不过,也许这只是我。
  • 它看起来也让我感到困惑,因为示例显示了文本的相反含义。

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


【解决方案1】:
await Navigation.PushAsync(new TargetPage());

此代码“等待”直到“TargetPage”被可视化,然后代码继续“OnOtherCode”。

如果你想在TargetPage关闭后执行一些代码,你应该在Navigation.PopAsync之后添加这段代码,或者在“TargetPage的OnDisappearing”事件中。

另一种解决方案可以是:在“TargetPage 的 OnDisappearing”事件中使用 MessagingCenter.Send 并在调用页面中订阅相同的消息

【讨论】:

  • 好的,我明白了。但是 DoOtherWork 需要访问源页面中的数据,这就是为什么我在推送之后而不是在目标页面中弹出之后这样做的原因。
  • 源页面是“TargetPage”还是“CallerPage”?
  • 源是调用PushAsync的第一个页面,目标是调用PopAsync关闭自身的第二个页面。
  • TargetPage 关闭后是否需要启动 DoOtherWork?
  • 是的,这就是我想做的
【解决方案2】:

你可以这样做:

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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2015-02-19
    • 2015-08-25
    • 2012-07-12
    • 1970-01-01
    • 2011-07-22
    相关资源
    最近更新 更多