C#中的异步和等待关键字

时间:2013-08-12 13:47:09

标签: c# asynchronous windows-8 parallel-processing

我教过异步编程有助于产生多个线程,以便异步线程永远不会影响UI,后续代码行不需要等到前一个线程完成。现在的想法是我异步调用一个弹出窗口,当它被调用时我想要隐藏底部的appbar。但令人惊讶的是,在实施时,在弹出窗口打开和解除之前,appbar不会被隐藏。无法理解为什么。这是抽象的代码片段。您的输入将帮助我更好地理解异步过程。

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

    var flyout = new cmpWebA.Flyout();

    await flyout.ShowAsync();

    this.BottomAppBar.IsOpen = false;

}

2 个答案:

答案 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来完成的,它不需要线程。

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