C# C中的Async和Await关键字#

C# C中的Async和Await关键字#,c#,asynchronous,windows-8,parallel-processing,C#,Asynchronous,Windows 8,Parallel Processing,我学到了异步编程有助于生成多个线程,这样异步线程就不会影响UI,后续代码行就不需要等到上一个线程完成。现在的想法是,我正在异步调用一个弹出按钮,当它被调用时,我想隐藏底部的appbar。但令人惊讶的是,当实现时,appbar不会隐藏,直到弹出按钮打开并关闭。我不明白为什么。这是一段抽象的代码。您的输入将帮助我更好地理解异步流程 private async void OnClick(object sender, TappedRoutedEventArgs e) { var flyout

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

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

    var flyout = new cmpWebA.Flyout();

    await flyout.ShowAsync();

    this.BottomAppBar.IsOpen = false;

}

调用异步操作涉及两个部分:启动和等待其完成

您编写的代码当前启动操作
flyout.showsync()
,然后等待其完成(
wait
),然后隐藏底部栏(
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的支持来完成的,它不需要线程


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

只是忘了再添加一个输入。这里的弹出按钮是在底部AppBar的按钮点击时触发的。我们不知道弹出按钮是什么。ShowAsync是什么,但我认为您误解了async/await的功能。。。特别是,它从来不会自动创建新线程。您的评论让我对异步/并行/并发编程之间的差异有了更多的了解,我发现了这一点,但是如果您能在此基础上增加更多的清晰度,我将不胜感激