C#中的Async和Await关键字

本文关键字:Await 关键字 Async 中的 | 更新日期: 2023-09-27 18:27:31

我学到异步编程有助于生成多个线程,这样异步线程就不会影响UI,后续的代码行也不需要等到上一个线程完成。现在的想法是,我异步调用弹出按钮,在调用它的同时,我想隐藏底部的应用程序栏。但令人惊讶的是,在实现时,appbar并没有隐藏,直到弹出按钮被打开并关闭。不明白为什么。这是一段抽象的代码。您的输入将帮助我更好地理解异步进程。

private async void OnClick(object sender, TappedRoutedEventArgs e) 
{
    var flyout = new cmpWebA.Flyout();
    await flyout.ShowAsync();
    this.BottomAppBar.IsOpen = false;
}

C#中的Async和Await关键字

调用异步操作包括两部分:启动和等待完成。

您的代码当前启动操作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;
}
异步性与并发性不是一回事。异步操作当然可以用线程实现,但它并不那么常见。例如,在等待缓慢的I/O操作完成时,您希望使用wait。这是通过在操作系统中内置对重叠I/O的支持来实现的,它不需要线程。

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