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

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

我有点困惑。

除了允许方法体使用await关键字之外,添加async本身不会做任何事情。 正确实现的异步方法不会阻止UI线程,但是一个不正确实现的方法肯定可以。

你可能想做的是:

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

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

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

1)异步键工作使得方法异步,没有阻塞,通过时间切片。 异步必须存在于等待,告诉等待任务完成,但之前的所有内容都将被执行。

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

2)只做一个线程hibernate,只有在线程睡眠完成任务之后,上面的任何代码才会执行​​。

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

这是一个很好的阅读msdn Asynchronous Programming with Async and Await !