有人可以向我解释一下:
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
}
答案 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已经解决了模态/非模态