C#中的异步修饰符

时间:2013-07-01 14:13:26

标签: c#

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

    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。我知道我必须启动另一个线程以避免阻塞,但我发现:

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

我有点困惑。

3 个答案:

答案 0 :(得分:36)

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

你可能想做的是:

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

答案 1 :(得分:11)

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

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

答案 2 :(得分:1)

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

在msdn Asynchronous Programming with Async and Await上阅读了很好的内容!