C#中的异步修饰符
本文关键字:异步 | 更新日期: 2023-09-27 18:20:30
我有个问题,这两种方法之间有什么区别?
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。我知道我必须启动另一个线程以避免阻塞,但我发现:
"异步方法提供了一种方便的方法,可以在不阻塞调用方线程的情况下完成可能长时间运行的工作"。
我有点困惑。
添加async
本身只允许方法体使用await
关键字。一个正确实现的异步方法不会阻塞UI线程,但一个不正确实现的方法肯定会阻塞。
你可能想做的是:
async private void Button_Click_1(object sender, RoutedEventArgs e)
{
await Task.Delay(2000);
MessageBox.Show("All done!");
}
async
本身不会启用异步(非阻塞)方法调用
您应该在async
函数中使用await
。
您应该阅读本文以更好地了解此功能。
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*/
}
很好地阅读了使用Async和Await的msdn异步编程!