C#中的异步修饰符

21

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

    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);
    }

他们两个都会阻塞我的用户界面。我知道我必须开启另一个线程来避免阻塞,但我发现:

"异步方法提供了一种方便的方式来执行潜在的耗时工作,而不会阻塞调用者的线程"。

我有点困惑。


3
你可以使用异步编程,但确保使用 "await" 关键字。 - now he who must not be named.
8
你知道使用async方法时会出现的编译器警告吗?仔细阅读它,它会告诉你出了什么问题。请注意,不要改变原意,但需要使语言更加通俗易懂。 - Stephen Cleary
3个回答

36

仅仅添加async并不会有其他作用,只是允许该方法体使用await关键字。一个正确实现的异步方法不会阻止UI线程,但是一个不正确实现的异步方法则可能会。

您可能想要做的是这样:

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

11

async仅仅使用它本身并不能实现异步(非阻塞)方法调用。
您应该在async函数内部使用await关键字。

您应该阅读这篇文章以更好地理解这个能力。


1

1)异步关键字使方法变为无阻塞的异步方法,通过时间分片。Async必须与await一起使用,以告知等待任务完成,但是所有之前的操作都将被执行。

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*/
}

在 msdn 使用 Async 和 Await 进行异步编程 有一份很好的阅读资料!


2
你的任务是在那里进行阻塞等待,这会不必要地消耗线程池的时间。通过使用 Task.Delay,你可以使整个过程正确地异步化,而不是使用异步覆盖同步。 - Servy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接