2013-07-01 96 views
21

我有问题,这两种方法有什么区别?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); 
    } 

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

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

我有点困惑。

+3

你可以使用异步但确保你使用“await”.. –

+8

你知道编译器警告你用'async'方法吗?阅读。它会告诉你什么是错的。 –

回答

11

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

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

36

添加async本身除了允许方法主体使用关键字await之外别无其他。一个正确实现的异步方法不会阻塞UI线程,但是一个不恰当的实现可以。

什么你可能想要做的是这样的:

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

1)异步重点工作,使无堵塞的方法 - 异步,通过时间分片。异步必须与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

+2

你的任务正在阻塞等待,这是不必要的消耗线程池的时间。通过使用'Task.Delay',你可以使整个事情正确地异步,而不是使用异步同步。 – Servy

+0

此代码无效... –

+0

谢谢! =)现在工作! – Fals