使用Navigation.Push打开页面时,异步是否具有任何优势?

时间:2018-07-20 06:17:38

标签: c# xamarin xamarin.forms

有人可以向我解释一下:

void openPage(object sender, EventArgs e)
{
   Navigation.PushAsync(new CFSPage());
   // some code here
}

async void openPage(object sender, EventArgs e)
{
   await Navigation.PushModalAsync(new CFSPage());
   // some code here
}

async void openPage(object sender, EventArgs e)
{
   await Navigation.PushAsync(new CFSPage());
   // some code here
}

2 个答案:

答案 0 :(得分:3)

模态而不是模态是它的意思:它将页面推入模式,或者将页面推入常规导航堆栈中。模态是指以更具吸引力的方式向用户显示的页面。例如,在iOS上,它的左上角没有后退箭头。作为开发人员,您需要为用户提供一种退出模式屏幕的方式。在大多数情况下,可以通过添加自定义按钮来完成此操作,但也可以通过长时间运行的操作来触发。

对于您的问题中的等待和不等待部分,我建议您查看一些有关等待/异步功能的资源。它可能很难破解,但是当您了解它的功能以及如何使用它时,便可以发挥自己的优势。

在这种特殊情况下,它可能被用来不阻塞UI,因此动画看起来不错。另外,未等待的版本会在完成之前完成推送调用的竞争,这可能导致意外行为。

答案 1 :(得分:2)

两者之间相当直接的区别

void openPage(object sender, EventArgs e)
{
   Navigation.PushAsync(new CFSPage());
   // some code here 1
}

async void openPage(object sender, EventArgs e)
{
   await Navigation.PushAsync(new CFSPage());
   // some code here 2
}

some code here 1中,您不能假定推送已完成 。因此,您在那里编写的任何代码都不能依赖它。在some code here 2中,您可以假定推送已完成。

您的代码在选项2中等待时,它不是阻塞线程。当然,您实际上可能希望将这些结合起来:

void openPage(object sender, EventArgs e)
{
   var abc = Navigation.PushAsync(new CFSPage());
   // some code here that doesn't depend on the push
   await abc
   // now the code that actually wants to rely on the push being complete
}

第一段代码对其线程进行了有用的处理,因此该代码继续进行。 如果,碰巧发生,当它到达await并且推送完成时,它将继续进行到第二个块。只有到那时仍然没有完成推送,我们才释放线程,希望可以找到一些工作可以在其他地方完成。

Gerald's answer已经解决了模态/非模态