单击“异步”方法按钮后,我的窗口不会保持活动状态

时间:2012-10-23 08:07:21

标签: c# wpf async-await

我有以下代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        this.Background = Brushes.Red;
    }

    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        int res = WaitFiveSecMethod();
        this.text2.Text = res.ToString();
    }

    private int WaitFiveSecMethod()
    {
        Thread.Sleep(5000);
        return 5;
    }

    private async void Button_Click_3(object sender, RoutedEventArgs e)
    {
        var res = await WaitFiveSecMethodAsync();
        this.text1.Text = res;

    }

    private async Task<string> WaitFiveSecMethodAsync()
    {
        Thread.Sleep(5000);
        return "5";
    }

}

我想显示点击“同步”按钮(按钮2)和点击“异步”按钮(按钮3)之间的区别。单击这两个按钮应该执行相同的耗时计算(在我的情况下用“Thread.Sleep(5000)”表示)。 目前使用异步和等待使我的客户端卡住我认为这些关键字不应该阻止我的客户端线程。 我做错了什么?

1 个答案:

答案 0 :(得分:3)

下面的代码同步工作并阻止UI,而不是异步:

private async Task<string> WaitFiveSecMethodAsync()
{
    Thread.Sleep(5000);
    return "5";
}

请记住,async只负责启用await关键字,如果您没有awaitasync无意义并转向同步。因此,异步方法必须至少包含一个await关键字。

更好的方法是,你应延迟等待等待 Task.Delay,这不会阻止你的UI线程:

private async Task<string> WaitFiveSecMethodAsync() 
{ 
    await Task.Delay(5000); 
    return "5"; 
}