0

我被教导异步编程有助于产生多个线程,以便异步线程永远不会影响 UI,并且后续代码行不需要等到前一个线程完成。现在的想法是我正在异步调用弹出窗口,并且在调用它时我想隐藏底部的应用程序栏。但令人惊讶的是,在实现时,应用栏不会隐藏,直到弹出按钮被打开并关闭。无法理解为什么。这是一段抽象的代码。您的输入将帮助我更好地理解异步流程。

private async void OnClick(object sender, TappedRoutedEventArgs e) 
{

    var flyout = new cmpWebA.Flyout();

    await flyout.ShowAsync();

    this.BottomAppBar.IsOpen = false;

}
4

2 回答 2

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;
}
于 2013-08-12T13:53:02.020 回答
0

异步与并发不同。异步操作当然可以用线程来实现,但它并不是那么常见。例如,您希望在等待慢速 I/O 操作完成时使用 await。这是通过操作系统中对重叠 I/O 的内置支持来完成的,它不需要线程。

如果您想要真正的并发性,让多个线程来完成一项工作,那么实际上创建线程是无可替代的。或任务。

于 2013-08-12T14:28:07.597 回答