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

他们俩都阻止了我的用户界面。我知道我必须启动另一个线程以避免阻塞,但我发现:

“异步方法提供了一种方便的方法来完成可能长时间运行的工作,而不会阻塞调用者的线程”。

我有点困惑。

4

3 回答 3

36

添加本身,除了允许方法体使用关键字async外,什么都不做。await一个正确实现的异步方法不会阻塞 UI 线程,但一个不正确实现的方法肯定可以。

您可能想要做的是:

async private void Button_Click_1(object sender, RoutedEventArgs e)
{
    await Task.Delay(2000);
    MessageBox.Show("All done!");
}
于 2013-07-01T14:19:03.457 回答
11

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

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

于 2013-07-01T14:17:01.217 回答
1

1) Async key work 通过时间分片使方法异步无阻塞。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 Asynchronous Programming with Async and Await上有很好的读物!

于 2013-07-01T14:24:16.857 回答