1

私は次のコードを持っています:

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)" で表されます)。現在 async と wait を使用していると、クライアントが動けなくなります。これらのキーワードがクライアント スレッドをブロックするべきではないと考えていました。私は何を間違っていますか?

4

1 に答える 1

3

以下のコードは同期的に動作し、非同期ではなく UI をブロックします。

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

asyncにはawaitキーワードを有効にする責任があることを覚えておいてください。したがって、非同期メソッドには少なくとも 1 つのキーワードが含まれている必要があります。awaitasyncawait

より良い方法は、UI スレッドをブロックしないように待機して遅延することです。 Task.Delay

private async Task<string> WaitFiveSecMethodAsync() 
{ 
    await Task.Delay(5000); 
    return "5"; 
} 
于 2012-10-23T08:31:56.230 に答える