C#中的异步修饰符

本文关键字:异步 | 更新日期: 2023-09-27 18:20:30

我有个问题,这两种方法之间有什么区别?

    async private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        Thread.Sleep(2000);
    }
    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        Thread.Sleep(2000);
    }

它们都阻止了我的UI。我知道我必须启动另一个线程以避免阻塞,但我发现:

"异步方法提供了一种方便的方法,可以在不阻塞调用方线程的情况下完成可能长时间运行的工作"。

我有点困惑。

C#中的异步修饰符

添加async本身只允许方法体使用await关键字。一个正确实现的异步方法不会阻塞UI线程,但一个不正确实现的方法肯定会阻塞。

你可能想做的是:

async private void Button_Click_1(object sender, RoutedEventArgs e)
{
    await Task.Delay(2000);
    MessageBox.Show("All done!");
}

async本身不会启用异步(非阻塞)方法调用
您应该在async函数中使用await

您应该阅读本文以更好地了解此功能。

1)Async键的工作通过时间切片使方法异步,没有阻塞。异步必须与等待一起存在,以告知等待任务的完成,但所有之前的东西会被执行。

async private void Button_Click_1(object sender, RoutedEventArgs e)
{
    var task = Task.Delay(1000);
    /*Do stuff*/
    await task;
}

2) 只要让线程只休眠,上面的任何代码都不会执行,只有在线程休眠完成任务之后。

private void Button_Click_2(object sender, RoutedEventArgs e)
{
    Thread.Sleep(2000);
    /*Do stuff*/
}

很好地阅读了使用Async和Await的msdn异步编程!