我教过异步编程有助于产生多个线程,以便异步线程永远不会影响UI,后续代码行不需要等到前一个线程完成。现在的想法是我异步调用一个弹出窗口,当它被调用时我想要隐藏底部的appbar。但令人惊讶的是,在实施时,在弹出窗口打开和解除之前,appbar不会被隐藏。无法理解为什么。这是抽象的代码片段。您的输入将帮助我更好地理解异步过程。
private async void OnClick(object sender, TappedRoutedEventArgs e)
{
var flyout = new cmpWebA.Flyout();
await flyout.ShowAsync();
this.BottomAppBar.IsOpen = false;
}
答案 0 :(得分:2)
调用异步操作涉及两个部分:启动它,等待它完成。
您的代码当前启动操作flyout.ShowAsync();
,然后等待其完成(await
),然后隐藏底栏(this.BottomAppBar.IsOpen = false;
)。
如果要在ShowAsync
运行时隐藏底栏,请在启动前将其隐藏,并在完成后显示:
private async void OnClick(object sender, TappedRoutedEventArgs e)
{
this.BottomAppBar.IsOpen = false;
var flyout = new cmpWebA.Flyout();
await flyout.ShowAsync();
this.BottomAppBar.IsOpen = true;
}
您也可以先启动ShowAsync
,然后隐藏底栏,然后等待完成,然后显示底栏:
private async void OnClick(object sender, TappedRoutedEventArgs e)
{
var flyout = new cmpWebA.Flyout();
var task = flyout.ShowAsync();
this.BottomAppBar.IsOpen = false;
await task;
this.BottomAppBar.IsOpen = true;
}
答案 1 :(得分:0)
异步与并发性不同。一个异步操作肯定可以用线程实现,但它并不常见。例如,您希望在等待慢速I / O操作完成时使用等待。这是通过内置支持操作系统中的重叠I / O来完成的,它不需要线程。
如果你想要真正的并发,让多个线程正在完成工作,那么实际创建线程是无可替代的。或任务。